int的取值范围
原码(True form):原码是一种计算机中对数字的二进制表示方法,数码序列中最高位为符号位,符号位为0表示正数,符号位为1表示负数;其余有效值部分用二进制的绝对值表示。
反码(1's complement,在中国大陆称作反码,港台地区称为一补数):如果机器数是正数,则该机器数的反码与原码一样;如果机器数是负数,则该机器数的反码是对它的原码(符号位除外)各位取反而得到的。
补码(2's complement,在中国大陆称作补码,港台地区称为二补数):如果机器数是正数,则该机器数的补码与原码一样;如果机器数是负数,则该机器数的补码是对它的原码(除符号位外)各位取反,并在末位加1。
正数的原码、反码、补码都是一样的。
如果正数和负数都用原码表示,如下表所示:(int型数据占4byte,32bit位)
用原码来表示一个有符号数会带来两个问题:
第一个问题就是正负相加不等于零。如1+(-1),按照原码表示等于-2。
第二个问题就是有两个零存在,分别为00000000 00000000 00000000 00000000和10000000 00000000 00000000 00000000。
可见,原码不适合用来表示有符号数。
为了保证正负相加等于0,尝试用反码表示有符号数。正数的反码与原码一样,负数的反码是除了符号位原码按位取反。所以,用反码表示如下:
1+(-1)按照反码就是-0(32个1,最高位的1表示负号)。同理2+(-2)也等于-0。
使用反码解决了第一个问题,但是第二个问题仍然未解决。此时就要用到补码了。
正数的补码与原码一样,负数的补码是除了符号位原码按位取反+1,也就是反码+1,用补码表示如下:
用补码表示的话,-0就不存在了,-0就变成了0,此时就只有一个0了。-21474836477(-(2^31-1))减1就是-21474836478(-(2^31)),而-21474836477的补码减1就是10000000 00000000 00000000 00000000,因此-21474836478的补码是10000000 00000000 00000000 00000000。整型数字在计算机中用补码表示,取值范围是-(2^31)~(2^31-1),即-21474836478~2147483647 。