在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邮箱里面
394021672@qq.com
先谢谢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
不太清楚 就不去误导你了
建议你看一下 二进制 原码 反码

在C语言中长度相同的有符号与无符号整型数间,原样赋值时为什么值...
在c语言中无符号(unsigned)和有符号(signed),数据范围不同,无符号和有符号的区别就是有符号类型需要使用一个bit来表示数字的正负,从而导致负数或者超过signed int数据范围时,在两者中的表示值不同,示例代码如下,include <stdio.h> int main(int argc, char *argv[]){ unsigned a;int b=-...

c语言中无符号和有符号的整形变量在 表示字符数据是为什么取值范围不一...
那是由于计算机的储存模式造成的。在计算机中,数字的储存形式是二进制。整形数是一个八位二进制数。如:xxxxxxxx 最大是:11111111 八个一 如果是无符号数,那么第一位就应该不是符号位,所以8个1的值是:255 如果是有符号,那么第一位将是符号位。0表示正,1表示负,如:01111111 表示数字大小的...

有符号与无符号数之间的区别 C语言
这说明,其实数据的表示在底层的位级表示是相同的,表示的值的不同是所定义的类型不同,也就是说我们想要解释这个位级串的方式不同导致了值的不同。如此题:-1和4294967295位级表示均为:0xFFFFFFFF,但使用unsigned解读为4294967295,使用int型解读为-1。这就是其区别。

C语言-带符号整数和无符号整数问题
回答:数字是有正负之分的,而正数前面的正号是可以省略的,无符号数实际上就是大于等于零的数,在C语言中,如果定义一个变量为无符号型,那么这个变量只能表示大于等于零的数,而有符号数就是包含负数,如果定义一个变量为有符号型,那么这个变量可以赋值为负数也可以赋值为正数。比如,无符号的int型,表示的范...

在C语言中有符号整数和无符号整数有什么差别?
它们所占的字节数其实是一样的,但是有符号的需要安排一个位置来表达我这个数值的符号是什么,因此它说能表示的绝对值就要比无符号的少一半。举个例子,我们有一个1个字节的整数(虽然这种类型不存在),那么无符号的就是这样:00000000-11111111 这个就是无符号的范围。一个字节是8位。下面有符号的,...

C语言为什么当无符号长整型和整型一起输入时会导致整型没有赋上值
回答:写成scanf("%u%d",&num1,&num2);就可以了,不需要l,scanf把l当成是两个数中间存在的一个字符了,类似于逗号,所以无法赋值给num2;你可以尝试输入4294967295l1111,也能读取到数值。

c语言中有符号和无符号整型数据处理区别
c语言中对于有符号和无符号整型数据处理区别,就在于对数据最高位的解释.对于一个有符号整数,C编译程序将把该值(二进制代码)的最高位作为符号标志位(符号标志位是0,表示正数;为1,表示负数)而对于一个无符号整数,该数的最高位将被作为数值处理.设int型数据占2个字节,则-1在内存中应以16位全1来...

C语言中有符号的与无符号的if比较结果不正确?
因为它们的类型不同,在进行比较前,先自动类型转换:b的值-1就按unsigned int 转换为4294967295,然后跟1200比较,它就出现b>a的情况了。你不妨unsigned int c=4294967295;然后,if(b==c)printf("b==c");试试看,是不是这样?

C程序中,有符号整型变量和无符号整型变量的区别在于哪里?
C语言中无符号整型变量和有符号整型变量在同一系统中所占用的数据宽度一样。不同的是:有符号整型变量把数据的最高位作为符号位使用, 因此能表示数的正负, 表示范围: 对于16位的变量为: -32368<=变量<=32367, 对于32位的变量为:-2147483648<=变量<=2147483647;无符号整型变量把数据的最高位仍作为...

C语言中有符号整型和无符号整型的区别
有符号:用最高为来表示符号位 , 1表示负,0表示正 无符号:全部用来表示实际数。两者的取值范围不同 有符号整型为 -32768 到 32767 无符号整型 为 0 到 65535

相似回答