对的,问题本质就是:C语言的数据是由约定来解释的,这是C面向底层的原因。同样的一个二进制编码,被理解成什么,其实不是语言本身规定的,而是程序员自己决定的,这点是C语言与其他编程语言区别很大的一个特性。其实你一开始就学过,对ASCII字符'A',它的编码是65,在程序的机器码中,这就是一个十进制整数65,当你决定要把它解释成字符并命令它输出时,就应该使用printf("%c", 65),这等于告诉printf()函数,“我要把整数65解释成字符,你替我把对应的字符打印出来”,而如果你不要字符,也可以这样printf("%d", 'A'),这时,输出的是65(正如前面告诉你'A'实际上就是以65储存的)。C++沿袭了C的这种char等效于int的特性,是迫不得已,但在其他的高级编程语言中,都力戒这种语法的,即使在机器内部确实'A'=65,但在语言代码中坚决不允许你写出char x = 65这样的东西,这样规定,都是有深意的。
所以,在C语言中,不要被自己声明的数据类型弄混。你完全可以定义unsigned int x = -1,但-1在计算机中无论你声明x是signed int还是unsigned int,它都是0xffffffff(对32位整数来说),在运算中,需要程序员自己警惕到底使用的是什么!最典型的陷阱,就是for (unsigned int i = 10; i >= 0; --i)这样的循环语句,此时变量i被编译器解释为无符号整数,永远是i>=0的,这是一个死循环,因为当--i到i=0,再继续--i时,你以为是-1,但实际上机器认为那是0xffffffff,是一个极大的正整数。
事实上,不是所有语言都认可unsigned这样的无符号数据类型,有些语言是不承认这种数据的,原因也在这里。在C编程规范中,也劝告程序员尽量使用常规int类型,这才是保证程序可移植性的编码。因此,说C语言程序的可移植性强,不要轻信,除非你确实遵守规则,一旦培养了坏习惯,优势也变劣势。
[
本帖最后由 TonyDeng 于 2012-7-24 15:41 编辑 ]