回复 11楼 stevenwu
好吧,我服了,再给你详细的说
首先,我们可以运算求得-1的补码是 1111 1111 1111 1111,32767的补码就是原码是0111 1111 1111 1111
因为 (32767) + (-32768) = -1
所以-32768的补码就是1000 0000 0000 0000,证明-32768的补码就是1000 0000 0000 0000没错
下一步,在C中,用高位置1来表示负数,short型占2个字节共16位,32768的二进制是1000 0000 0000 0000,高位为1,系统会认为是负数,所以32768需要用长型表示,占4个字节。最高位就不是1了。(0000 0000 0000 0000 1000 0000 0000 0000)
-32768在内存中的表示是1000 0000 0000 0000。过程是:先读入正值32768(1000 0000 0000 0000),再取反(0111 1111 1111 1111),再加1(1000 0000,0000 0000)
再下一步:short型占2个字节共16位,最大的short类型的数为0111 1111 1111 1111 十进制中即 32767,再加1为32768,二进制为:1000 0000 0000 0000,其首位是1,系统会认为是负数,所以16位类型的数字中最大的是32767。32位类型的数字中有32768,原码为0000 0000 0000 0000 1000 0000 0000 0000 0000,反码为1111 1111 1111 1111 0111 1111 1111 1111,在最后位上加1得到-32768的补码1111 1111 1111 1111 1000 0000 0000 0000,取低16位,1000 0000 0000 0000就是-32768的补码,符合符号的规定。所以short类型的数据范围就是-32768~32767。
在short类型的数中,-32768比较特殊,最高位占用了符号位,也就是最高位1就是符号位,也就是最高位1既充当数据的角色,也充当符号表示的角色,不需要再多加1了