int型
在32位编辑器里,int型是4字节(Byte),也就是32bit,32个0或1 。在64位编辑器下则是8个Byte,64bit 。一般情况下,我们通常使用32位的编辑器。所以,一个int型可以表示2^32种情况。
int型里面保存的是带符号的整数。它的最高位是符号位,剩下的31位才是数字位。(如果想使用不带符号的变量,可以使用unsigned int)。0代表正数,1代表负数。所以,int型的范围是 [-2^31+1,2^31-1]。
是这样吗?并不是。int型的范围是[-2^31,2^31-1] 。为什么负数会比正数多一个。
因为计算机存储数据都是以补码的方式储放的。众所周知,计算机它不认识十进制,它只认识0,1,也就是二进制。我们输入电脑的数字,编译器会把它翻译成二进制,那个就是原码。例如,127,它的二进制是0111 1111 。那么它存的原码就是
0000 0000 0000 0000 0000 0000 0111 1111 (第一个0是代表正数)
int型的最大值原码就是
0111 1111 1111 1111 1111 1111 1111 1111 。
以此类推,最小值的原码应该是
1111 1111 1111 1111 1111 1111 1111 1111 。
原码并不适合进行减法运算,所以大佬们发明了补码。补码运算使得减法变成了加法。
int 型最大值的补码是
0000 0000 0000 0000 0000 0000 0000 0001
int型的最小值的补码是
1000 0000 0000 0000 0000 0000 0000 0001
值得注意的是,如果题目说。,在寄存器里的补码是xxx,要你判断寄存器的数是什么。千万要把补码翻译成原码,那个原码才是真值。
好了,我们继续int型的范围问题,
在原码里会有正负0的情况,就是
0000 0000 ……0000
1000 0000 ……0000
但是在补码里是没有这个情况的,补码把
1000 0000 0000 0000 0000 0000 0000 0000 定义成了-2^31,而不是-0 。
所以,int型的最小值的补码并不是我刚才写的那个
而是1000 0000 0000 0000 0000 0000 0000 0000 0000
这也就是int型的范围是[-2^31,2^31-1]的原因。