unsigned int b=65535;printf("%d",b);

为什么我的编译器显示-1,
可很多人说是65535

%d输出时不是要考虑符号吗?%u肯定是65535

计算机中的数据都是以二进制补码的形式存放的。以Turbo C编程环境为例:整型变量(int)占有两个字节的内存,其中有符号数的最高位为符号位。1表示负数,0表示整数。无符号数(unsigned int)也占有两个字节的内存,但是它没有符号位,最高位也是数据的一部分。例如1000000000000001表示负整数,其值为-1(符号位为1,也就是一串0之前的1),0000000000000011表示正整数,其值为3,而对于无符号数最高位不代表符号,例如1000000000000000表示无符号数,其值为1乘以2的15次方,即32768。
在你的程序中,你定义了一个无符号整型变量b,他在计算机内部的表示方式为1111111111111111(16个数字1,可以计算一下,其值为65535)但是当输出的时候是以有符号的十进制整型数据输出,所以计算机就将内存中的数据作为有符号数处理,其值为以补码形式表示的二进制数据,它是一个负数,因为它的最高位(第十五位)是1。其值为:对1111111111111111求反码即1111111111111111减去1,就是1111111111111110,1111111111111110也就是它在计算机内的反码,所以其原码为1000000000000001,即为-1.如果以无符号数格式输出,自然其值为65535啦。
对于Turbo C是这样的,对于其他的编译器我不知道,ahliusheng说的可以参考下。

相关知识到网上以原码反码补码为关键词搜索即可。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2008-09-03
输出-1表示%d把b看作是一个负数
65535是11111111 111111111,
最高位1标志负号,于是被看一个补码,
按位取反后为10000000 00000001,
所以为-1
第2个回答  2008-09-03
%d是输出一个int型,你这样输出就相当与把b当成一个int输出,int的第一位是符号位,所以是-1

%u是输出一个unsigned int,所以是65535
相似回答