原码反码补码概念和计算
补码是计算机底层存储数据的方式
-
对于正数:
原码:最高符号位为0,其他按数计算
反码、补码都与原码一样。 -
对于负数:
原码:最高符号位为1,其他按数计算
反码:原码中除符号位,其他的数值位按位取反,即0变1,1变0
补码:反码+1 -
以byte类型示例:
byte是1个字节,一个字节为1Byte = 8 bit位
-
1的原码,反码,补码:0000 0001
-
-1的原码:1000 0001
反码:1111 1110
补码:1111 1111 -
24的原码,反码,补码为:0001 1000
-
-24的原码:1001 1000
反码:1110 0111
补码:1110 1000
基础数据类型取值范围的计算
- byte数据类型1字节
0000 0000 = +0
- 最大正数的原码,补码:0111 1111 = 2^7 - 1
- 最大负数的原码 1000 0000
反码 :1111 1111
补码:1000 0000 = - 2^7
原码: 1000 0000 = - 0 看起来代表-0
但底层代表 - 2^7
分析:相当于是把-0
默认定为-2^(bit位-1)
一个最高位做符号位,而-0的补码,相当于最高位又做负数符号又算作数值位,所以取值范围负数比正数多一个-0
即 -2^(bit位-1)
其他字节依次类推
- short 2字节
00000000 00000000 = +0
- 最大正数的补码:01111111 11111111 = 2^15 - 1
- 最大负数的补码:10000000 00000000 = - 2^15
反码: 11111111 11111111
原码:10000000 00000000 = - 0 = - 2^15
- int 4 字节
00000000 00000000 00000000 00000000 = +0
- 最大正数的补码:01111111 11111111 11111111 11111111 = 2^31 - 1
- 最大负数的补码:10000000 00000000 00000000 00000000= - 2^31
反码:11111111 11111111 11111111 11111111
原码:10000000 00000000 00000000 00000000 = - 0 = - 2^31
原理:
有两种0的表示方法,即“+0”和“-0”。
实际上,在32位系统下int类型中,我们计算机已经强行规定了这种情况,数字0采用“+0”的表示方法,即00000000 00000000 00000000;而“-0”这个特殊的数字被定义为了-2^31。
无符号整形,4字节,32位全是数值位。
类型名称 | 占字节数 | 取值范围 |
---|---|---|
int | 4B | -2^31 ~ 2 ^31-1 |
unsigned int | 4B | 0 ~ 2^32 |
简单理解就是:
例如8个bit位,假设最高位也是数值位,因为最低位是2^0
,所以1000 0000 == 2^7
,所以 正负最大的值原码都是0111 1111 = 2^7 - 1
,1111 1111 = -2^7 - 1
(因为1000 0000 - 1 = 0111 1111)
但是有特殊情况,就是 - 0,+ 0 == 0000 0000。- 0不是0而是代表最高位符号也算作值的特殊情况
即最大负数的原码 1000 0000
反码 :1111 1111
补码:1000 0000 = - 2^7
所以最终范围是-2^7 ~ 2&7 - 1