有一道关于C语言的题,希望大家可以帮助我理解一下

unsigned int a=65535;
printf("a=%d\n",a);
为什么运行结果为a=-1?

因为定义a为无符号型整数,其65535的二进制表示为1111111111111111,即16个一。而在函数printf中使用%d,即表示以整数的类型输出,整数类型默认是有符号的,所以将16个位分为一个符号位,和十五个数据位。又因为编码系统默认符号位为1表示负数,而在计算机编码中,负数使用补码表示,所以1111111111111111被认为是某一负数的补码,又根据补码的计算方法计算源码(负数符号位不变,数据位取反加1)为1000000000000001,为—1,所以得出如此结果。如果使用%u,则表示以无符号整数类型输出,则会输出65535.
温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-08-05
朋友你好,这个题是这样的,因为unsigned int a的取值范围为1,2,3······65535,若你程序是那样的,则运行的结果为65535,而不是-1,若你的程序为:
unsigned int a=65536;
printf("a=%d\n",a);
则结果为:a=1
若你的程序为
unsigned int a=65537;
printf("a=%d\n",a);
则结果为:a=2
不知你体会到没有,也就是一个圈的意思,若数大于范围,则它就从最后的那个数向后再推。这个重在意会。希望能帮到你。追问

谢谢你的详细答案,但是书上答案给的是 如果是%u,则输出的是65535;%d输出的是-1,和你的答案貌似有些冲突

追答

你不要看书不书上,你要去电脑上运行一下才知道到底哪个是对的呀,实践才能出真理的。且原理也是这样的,没有错的。

本回答被网友采纳
第2个回答  2012-08-05
在输出的时候unsigned int的65535被转化为int型,printf("a=%u\n",a);就不会发生这种转换。
第3个回答  2012-08-05
65535 = 0xFFFF = 11111111 11111111 11111111 11111111 (B)
而-1也是11111111 11111111 11111111 11111111 (B)
所以就输出-1了。
这关于补码问题。
第4个回答  2012-08-05
补码的事情,你打印用的不是无符号打印,建议用一楼的。