定义了unsigned int 为何用%d输出不用呢?

假设int类型数据占两个字节,如果定义unsigned int a=65535,则语句printf(“%d”,a);的输出结果是( b)A、
65535
B、
-1
C、
1
D、
-32767
为什么答案是b呢?不应该是a吗?

因为65535在计算机中存放是以二进制形式的,是1111 1111 1111 1111这样的。由于是unsigned型,所以可以有16位。
但对于int型(%d),只能存放15位,第一位表示的是正负。由于第一位是1,所以%d输出时候应该是负数。而负数是以补码形式存放的。
所以对于1111 1111 1111 1111,它应该是(1111 1111 1111-1)的补码,再加负号,就是0000 0000 0000 0001加负号,就是-1.来自:求助得到的回答
温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-01-03
计算机是二进制表示数据的,65535的二进制形式是这样的1111111111111111,但是计算机不知道正负,所以第一位一般是符号位1表示负数0表示正数,如果%u输出就表示第一位不是符号位,而是数据位,如果是%d输出那么第一位就是符号位了,有符号的十进制,他是采用补码形式存储的,所以答案应该是-1,这个答案是16为操作系统时候的答案,32为操作系统输出应该是65535。也就是说xp以上操作系统输出就是65535
现在的教材也不改一改坑死人啊
第2个回答  推荐于2016-02-25
因为unsigned int在二进制中为16位,而%d在二进制中为15位为所以是输出不了的。
第3个回答  2013-01-03
是这样的,题目说int是两个字节,也就是说用16个二进制表示,16个二进制能表示的整数是65 536个,0到65535,这里的65535=1111111111111111B 但是这里printf中是%d,也就是有符号的十进制,他是采用补码形式存储的,所以65535(1111....1B)是-1。 (十进制-1的补码是11111....1B)
第4个回答  2013-01-03
%u是输出十进制无符号整数。追问

还是不懂啊,可是题目里面说的是"%d”啊
65535怎么就会变成-1了呢

追答

有符号的-1和无符号的65535在计算机里是一样的,用二进制就是1111111111111111B,用十六进制就是0xffff