为什么Java中int型数据取值范围是[-2^31,2^31-1]

1、为什么Java中int型数据取值范围是[-2^31,2^31-1],多么神奇的问题。

  1.1、int是Java中的8种基本类型之一,一个int值占4个字节byte,一个字节是8位bit(即8个二进制位),所以int型占32位。其中第一位是标志位,标志位为0表示正数,标志位为1表示负数,剩余的31位是用来表示数字部分的。

  1.2、在计算机中,数值一律用补码来表示和存储,原因在于,使用补码,可以将符号位和数值域统一处理。同时,加法和减法也可以统一处理。

    1)、正整数的补码是其二进制表示,与原码相同。正数的反码与其原码相同,正数的原码、反码、补码都是相同的。

      例:+9的补码是00001001。注意:这个+9的补码是用8位2进制来表示的,补码表示方式很多,还有16位二进制补码表示形式,以及32位二进制补码表示形式,64位进制补码表示形式等。每一种补码表示形式都只能表示有限的数字。

    2)、求负整数的补码,将其原码除符号位外的所有位取反(0变1,1变0,符号位为1不变)后加1。即负数的反码是对正数逐位取反,符号位保持为1。负数的反码等于原码符号位不变,其余各位逐位取反,补码等于反码加1。

      例:-5对应正数5(00000101),那么-5(10000101),→所有位取反(11111010)→加1(11111011),所以-5的补码是(11111011)。

    3)、0的补码,数0的补码表示是唯一的。

      例:[+0]补=[+0]反=[+0]原=00000000,[-0]补=11111111+1=00000000。

 

2、为什么Java中int型数据取值范围是[-2^31,2^31-1]。即-2147483648 ~ 2147483647。

  2.1、因为int型数据类型是有符号位的,所以这里拆分为两部分,一部分是正数,一部分是负数进行观察。

    1)、正数的范围是从1 ~ 2147483647的。

      例:1的原码为0000 0000 0000 0000 0000 0000 0000 0001。2147483647的原码为0111 1111 1111 1111 1111 1111 1111 1111。所以最大的正整数是2147483647。这里简单计算一下,为什么原码为0111 1111 1111 1111 1111 1111 1111 1111的最大的正整数是2147483647。当为1位时0000 0000 0000 0000 0000 0000 0000 0001,最大值的二进制就是1,也就是十进制的1 = 1,也就是2^1 - 1,当为2位时0000 0000 0000 0000 0000 0000 0000 0011,最大值的二进制是11,也就是十进制的1 + 2 = 3,也就是2^2 - 1,同理,8位时0000 0000 0000 0000 0000 0000 1111 1111,最大值的二进制是8个1,也就是1111 1111,算下来的十进制数值就是1 + 2 + 4 + 8 + 16 + 32 + 64 + 128 = 255,也就是2^8 - 1,依此类推即可。
    2)、负数的范围是从-1 ~ 2147483648的。

      例:-1的原码为1000 0000 0000 0000 0000 0000 0000 0001,

          反码为1111 1111 1111 1111 1111 1111 1111 1110,

          补码为1111 1111 1111 1111 1111 1111 1111 1111。

        -2147483647的原码为1111 1111 1111 1111 1111 1111 1111 1111,

                 反码为1000 0000 0000 0000 0000 0000 0000 0000,

                 补码为1000 0000 0000 0000 0000 0000 0000 0001。

那么为什么负数的范围是从-1 ~ 2147483648的。因为要看0了。

    3)、在二进制中,0有两种表方法。+0的原码为0000 0000 0000 0000 0000 0000 0000 0000,-0的原码为1000 0000 0000 0000 0000 0000 0000 0000,因为0只需要一个,所以把-0拿来当做一个最小的数-2147483648。-2147483648的补码表示为1000 0000 0000 0000 0000 0000 0000 0000,在32位没有原码。由于1000 0000 0000 0000 0000 0000 0000 0000本身代表的是2147483648(即2的32-1次方),再加上最高位为1,那么就是个负数,再加上所有的二进制表示又少了一个,因此,1000 0000 0000 0000 0000 0000 0000 0000就顺理成章的成了-2147483648,当然,1000 0000 0000 0000 0000 0000 0000 0000是补码,它没有原码和反码。

    4)、-2147483648的补码表示为1000 0000 0000 0000 0000 0000 0000 0000,在32位没有原码。注意,这个补码并不是真正的补码,-2147483648真正的补码是1 1000 0000 0000 0000 0000 0000 0000 0000,在Java的int基本数据类型中溢出了。所以带符号32位int类型整数为-2147483648~2147483647

上一篇:过大的整数


下一篇:牛客 自然数拆分Lunatic版