在C语言中长度相同的有符号与无符号整型数间,原样赋值时为什么值不同

#include"stdio.h"
main()
{
unsigned a;
int b=-1;
a=b;
printf("%d->%u\n",b,a);
a=65534u;
b=a;
printf("%d->%u\n",b,a);
}

例如上面的这段代码,我在WIN32平台,集成开发环境是VC++6.0的输出的结果的
-1->4294967295
65534->65534

就是不知道上面的4294967295是怎么来的
我的猜想是这个无符号a在内存中的存储空间是4个个字节然后得到了这个值,但是具体的过程却不知道怎么推出的,或许这个猜想也是错的
有没有知道的麻烦帮忙解答下然后把答案发到我QQ邮箱里面
[email protected]
先谢谢1楼和2楼的回答额!
二楼的朋友那我多问个问题额?那为什么返回的结果会变成4294967295,呵呵!刚开始我自己读完这个程序觉得输出的a是1呵呵!这是不是与一楼说的二进制的补码与原码有关呀,我刚找到资料还没看呵呵,那我先看完吧。希望你也能给我指教下哈,先谢过一下额!

在c语言中无符号(unsigned)和有符号(signed),数据范围不同,无符号和有符号的区别就是有符号类型需要使用一个bit来表示数字的正负,从而导致负数或者超过signed int数据范围时,在两者中的表示值不同,示例代码如下,
#include <stdio.h>

int main(int argc, char *argv[])
{
unsigned a;
int b=-1;
a=b;
printf("%d %d-> %u\n",sizeof(int),b,a);//输出-1 -> 4294967295(0Xffffffff,-1的补码)
a=2147683648;//0X80000000(-2147683648的补码)
b=a;
printf("%d -> %u\n",b,a);//输出-2147683648 -> 2147683648
return 0;
}

win32平台下,无符号(unsigned)和有符号(signed)int都占用4个字节,数值范围如下,
有符号int:-2147683648 到2147683647(- 2^31 到2^31- 1);
无符号int:0到4294967295(0 到2^32 - 1);
无符号类型int能保存2倍于有符号类型的正整数数据,多1个bit位。正数的补码就是其自身,负数的补码是在其原码的基础上, 保持符号位不变, 其余各位求反(反码),最后+1(即在反码的基础上+1)。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-06-20
4字节储存的数据范围是00000000-FFFFFFFF
-1的补码是100000000-1=FFFFFFFF 最高位为符号位
作为无符号输出的话FFFFFFFF=16^8-1=2^32-1=4294967295
第2个回答  2010-06-20
在VC里,一个unsigned 是占4个字节的
由于无符号,所以最高位的1并不是符号位
2的32次方-1 刚好为4294967295
所以……

补充:
首先要知道一点 数的运算是是以补码进行的
b即-1的补码是
1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 (ffffffff)
而a为无符号数,所以它的补码原码相同,所以有了这种结果
你认为为1,可能你是直接以原码算的,而且还忽略了最高位1吧本回答被提问者采纳
第3个回答  2010-06-19
不太清楚 就不去误导你了
建议你看一下 二进制 原码 反码
相似回答