东莞长安镇河南黑帮:请问我的C程序错在哪里?

来源:百度文库 编辑:高校问答 时间:2024/04/29 11:18:15
#include<stdio.h>
main()
{
unsigned int x;
x=65535;
printf("%d\n",x);
}
为什么输出的是-1?

#include<stdio.h>
main()
{
unsigned int x;
x=65535;
printf("%d\n",x);
}
这个是最基本的问题,我建议你看看书~
%d系统输出的是有符号位的,unsigned int的范围是0-65535,而int的范围是-32768到32767,所以你写的 printf("%d",x)越界了,根据补码运算,就是-1,关于补码你可以到网上查一下

因为65535用无符号16位二进制表示是全1(16个1)
而当你用%d输出的时候,是有符号的,按照补码表示的方法
对16位的全1,因为最高位为1,所以是个负数。
而它的值可以这样计算,
逐位取反加1得到绝对值,再补上符号位
所以:
16位的全1逐位取反为全0,然后加1即得1,因为是负数,所以是-1。

%d: The integer argument is printed as a signed decimal;
%u: The integer argument is printed as an unsigned decimal.

楼上回答是错误的,误人子弟啊!
实际的问题是:
printf("%d",x)是指输出有符号的数字,应该使用printf("u%", x)即无符号整数。

输出要用printf(“%ld\n”,x)

因为溢出啊!