Java中int正数范围为2^31-1?含原码、反码、补码

前提基本知识

  1. Java或32位或64位系统中int占4个字节(Byte)
  2. 1个字节等于8位(1Byte=8BIT)
  3. 所以理论上int占了32位

举例子

当位数为1时

0000 0000 0000 0000 0000 0000 0000 0001

转成科学计数法:2^1 - 1,所表示最大十进制为1

当位数为2时

0000 0000 0000 0000 0000 0000 0000 0011

转成科学计数法:2^2 - 1,所表示最大十进制为3

以此推论

当扣除最大位数的符号位时

0111 1111 - 1111 1111 - 1111 1111 - 1111 1111

转成科学计数法:2^31 - 1,所表示最大十进制为2147483647

原、反、补码知识扩展

以下知识点对原码,反码,补码进行简单的概括说明

原码

  1. 计算机中进行正负值运算时,可能出错(1-(-1)=-2)
  2. 正负0之分

反码

  • 作用:解决了正负值计算问题
  • 表示:正数反码为原码,负数则是符号位不变,其余都取反(0->1,1->0)

缺点:

  1. 正负0之分

补码

  • 作用:1. 解决了正负0问题([+0]补=[+0]反=[+0]原=00000000,[-0]补=11111111+1=00000000。)2. 利用最高位溢出,将减法运算转为加法运算(a+(-b) = c)
  • 表示:正数的补码为原码,负数为反码末位+1

小结

计算机中数值一律用补码表示和存储

正数的原码、反码、补码都是相同的(二进制表示)

负数取值范围比整数多一个(原文)

这里有一个0值的差别。
以最简单的单字节char型为例。占8位,最高位为符号位。
这样0值就有了
0000 0000 (正零)
1000 0000 (负零)
两种。
从数学角度上,是没区别的,可是用两种形式表示一个数,明显是浪费了。
于是计算机存储就约定,当符号位为0,即正零时才是0.符号位为1时,让它去表示另外一个数好了。
(上面这句话是重点,让它表示另外一个数,就代表符号位也会参与取反)
原码:1000 0000首先符号位为1,是个负数,
反码,0111 1111
补码,1000 0000
又回来了… 但这时代表的就是值了,注意这里的1已经不是符号位了。计算其值就是128.
于是 1000 0000就表示成了-128

参考地址

Java中int类型范围参考地址

原码、反码、补码参考地址

解释一下为啥负数的取值范围比整数要多一个

猜你喜欢

转载自www.cnblogs.com/guaosky/p/12628183.html