c++中赋值时类型的转换是怎么换的

c++中赋值时类型的转换是怎么换的 程序段如下short int a = -1;unsigned long b;b=a为什么执行后 b = 4294967295而b定义为long b时 执行后b=-1
2026年09月22日 12:49
有3个网友回答
网友(1):

数值在计算机内是以补码的形式保存的。
short int占2字节(16位),-1的补码是1111,1111,1111,1111。unsigned long和long都是4字节(32位),当把长度小的类型赋给长度大的类型时,会把原来的值放到低位,然后在高位用原来的值的最高位来填充,-1的最高位是1,把它赋给b后b的值就是1111,1111,1111,1111,1111,1111,1111,1111。
对于unsigned long,即无符号长整型(只包含非负数,所有32位都被解释成数值),1111,1111,1111,1111,1111,1111,1111,1111就是4294967295。
而对于long,即有符号长整型(最高位被当成符号位,0表示非负数,1表示负数),1111,1111,1111,1111,1111,1111,1111,1111就是-1。

网友(2):

如果a=-1;b=a;b会等于无符号长整型unsigned long能表示的最大的正整数值2^32-1;
应该可以这样理解:
如果b不是无符号,那他b就等于-1;负数在内存中用补码表示
VC++中长整型用四个字节表示;
-1原码=0000 0000 0000 0000 0000 0000 0000 0001
补码=1111 1111 1111 1111 1111 1111 1111 1111(取反,加1,最高位1表示负数)
但b是无符号型的,最高位不用来表示正负数,他是非负整数,非负整数在内存中用原码表示。
所以b在内存表示的二进制1111 1111 1111 1111 1111 1111 1111 1111就等于b的实际值。。。
1111 1111 1111 1111 1111 1111 1111 1111=2^32-1= 4294967295

网友(3):

long是有符号的,unsigned long是无符号的,永远>=0