前提基本知识
- Java或32位或64位系统中int占4个字节(Byte)
- 1个字节等于8位(1Byte=8BIT)
- 所以理论上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)=-2)
- 正负0之分
反码
- 作用:解决了正负值计算问题
- 表示:正数反码为原码,负数则是符号位不变,其余都取反(0->1,1->0)
缺点:
- 正负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