c语言提问main() {int i=-1; unsigned u=65536; printf ("%d,%u",i,i); printf("%d,%u",u,u);}要答案原因

要详细原因~~

输出结果为:
-1,4294967295
65536,65536
分析如下:
%d—整型格式化输出符,有符号的。
%u—整型格式化输出符,无符号的。
我想其他3个的输出结果应该是很清楚的,主要是第2个为什么是4294967295呢?
无符号的int的数值范围是0~4294967295,而整型数值在内存中是以其补码的形式存放的,正数的
补码是其本身,而负数的补码则不是,我以一个一个字节的内存大小来说明:-1
原码:1,000 0001,最高位表示符号位,0为正,1为负。其补码的转换方法是:符号位不变,数值
位取反再加1,因此,-1的补码为:1,111 1111。对于int为32位4字节的,转换方法一样。
那么,int i=-1,在内存中存放的补码值为:1,111 1111 ... 1111 1111。当以%u格式符形式输出时,最高位的1的性质就变了,编译系统就会把最高位的1
也当成了数值位了,而不是符号位了,那么输出的值就是4294967295了。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-09-19
我用的vc6.0运行结果是-1,4214294967295,65536,65536
int i表示i是个有符号数,i=-1(既:1000 0000 0000 0001),负数在计算机里使用补码表示的即:1111 1111 1111 1111,但是输出的时候按照无符号格式(%u)输出按理也就是65535了
不同编译器范围不同,C语言没有明确规定
但是在Turbo C中为两个字节,即0~2^16-1(62353)
在Visual C++6.0中为4个字节,即0~2^32-1(4394967295)
一个字节8位
第2个回答  2011-09-19
不同编译器会不一样,在int和unsigned为2字节的版本中结果是
-1,65536-1,65536
因为整形变量最高位为符号位,为一个int型变量赋值65536或把值为65536的无符号整型变为整型都溢出了,实际上与-1的二进制码是一样的
同样把-1转换成无符号整型也会变成65536
第3个回答  2011-09-19
unsigned long[int]的范围是 0~4294967295而printf ("%d,%u",i,i); 中的i的值范围不在 0~4294967295但是在c语言当中0~4294967295的数是一个循环的圈子即-1对应4294967295
-2对应4294967294 4294967296对应0
第4个回答  推荐于2017-10-26
-1,4294967295;65536,65536;原因是u表示无符号整形,无符号整形的范围是0-65535,而-1超出了这个范围,输出会出错;追问

那为啥会出现65536?不是无符号型的范围是在0~65535之间吗?为啥会出现65536?

追答

是的,但是因为我们定义的是整形,如果是VC的话一个整形占用的内存是4个字节,是三十二位,所以范围应该会变成2^32次方,正如楼上所说C语言没有明确规定
但是在Turbo C中为两个字节,即0~2^16-1(62353)
在Visual C++6.0中为4个字节,即0~2^32-1(4394967295)
一个字节8位。

本回答被提问者采纳
相似回答