数值在计算机内是以补码的形式保存的。
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。
如果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
long是有符号的,unsigned long是无符号的,永远>=0