原码 反码 补码 移码

计算机的计算都是使用二进制。底层的数据也是"二进制表达形式的补码形式"

机器数:一个数在计算机中使用二进制的表示形式,机器数带符号,使用最高位存放符号,0代表正数,1代表负数。

真值:正数或者负数的真值就是其绝对值对应的二进制数,将第一位符号位直接用负号表示。0000 0001的真值 = +000 0001 = +1,1000 0001的真值 = –000 0001 = –1。

通过JAVA中的int型举例介绍下来概念,int型占用4个字节(byte),也就是第32位(bit)存放符号。

原码:符号位+真值,即使用最高位存放符号,0代表正数,1代表负数。

32 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1  | 位的序号
--------------------------------------------------------------------------------------  | 
 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0 0 0 0 0 0 0 0 1 1  | 3的二进制原码
 1  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0 0 0 0 0 0 0 0 1 1  | -3的二进制原码

反码:正数的反码即原码,也就是说正数的反码与原码一样。负数的反码是在原码的基础上,符号位不变,其余位进行取反,也就是1变0,0变1。

32 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1  | 位的序号
--------------------------------------------------------------------------------------  | 
 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0 0 0 0 0 0 0 0 1 1  | 3的二进制反码
 1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1 1 1 1 1 1 1 1 0 0  | -3的二进制反码

补码:正数的补码即原码,同样的正数的补码与原码一致。负数的补码在其原码的基础上,符号位不变,其余位进行取反,最后在加1。

32 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1  | 位的序号
--------------------------------------------------------------------------------------  | 
 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0 0 0 0 0 0 0 0 1 1  | 3的二进制补码
 1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1 1 1 1 1 1 1 1 0 1  | -3的二进制补码

移码:移码是对补码的符号位进行取反。

32 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1  | 位的序号
--------------------------------------------------------------------------------------  | 
 1  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0 0 0 0 0 0 0 0 1 1  | 3的二进制移码
 0  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1 1 1 1 1 1 1 1 0 1  | -3的二进制移码

为了尽可能的简单的实现硬件的电路设计,计算机只去进行加法运算,这样对于两数想减,可以变为一个正数加一个负数。负数的计算就使用了反码来实现。但是还有一个问题就是0的表示会出现正负0的问题,于是使用了补码来统一0的编码,同时补码还可以多表示一个最小值,以int型为例,其中使用了32位来存数。

使用反码计算减法

使用补码解决0的符号位以及两个编码的问题(正负0),同时多出一个最低位。这也是int类型最小值可以是 − 2 31 {-2^{31}} 231,而最大值是 2 31 − 1 2^{31}-1 2311的原因。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

顧棟

若对你有帮助,望对作者鼓励一下

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值