[ 小记 ] 原码反码补码

前言:可能需要一些十进制与二进制转换和二进制进位知识
后文皆以字节(byte)为例

原码

第一位作为符号位,0表正数,1表负数

0000 0000//0
1000 0000//-0
0000 0001//1
1000 0001//-1
0111 1111//得到 byte 最大值127

反码

原码负数计算问题

1000 1010 + 0000 0001 = 1000 1011//-10 + 1 = -11

为解决原码计算负数的问题,反码出现
原码反码:符号位不变,其余按位取反

1000 1010//原码-10
1111 0101//反码-10

使用反码表示负数计算

1111 0101 + 0000 0001 = 1111 0110//-10 + 1 = -9

正数的原码=反码=补码

补码

反码的0有两种表示方式,导致跨0运算有误差

0000 0000//0
1111 1111//-0
1111 1110 + 0000 0010 = 0000 0000//-1 + 2 = 0

于是,令其错位
在这里插入图片描述
使用补码计算

1111 1111 + 0000 0010 = 0000 0001//-1 +2 =1

至此,可完美运算两数相加
同时,-127反码向下错位得到-128

1000 0000//反码-127,补码-128

计算机数据存储和计算都使用补码
所以,byte取值为-128到127

从原码直接到补码

不妨设负数的二进制为未知数

0000 0001 + ???? ???? = 0000 0000//1 + (-1) = 0
0000 0010 + ???? ???? = 0000 0000//2 + (-2) = 0
0000 0011 + ???? ???? = 0000 0000//3 + (-3) = 0
-1 = 1111 1111
-2 = 1111 1110
-3 = 1111 1101

实际上,这样的思路更合理和易理解
最后奉上负数的补码计算方法:

 1. 取负数绝对值的二进制
 2. 按位取反
 3. 再加1

例如:

 1. 计算-7绝对值7的二进制0000 0111
 2. 按位取反1111 1000
 3. 再加1-7的补码1111 1001

补充

  1. 补码使得在设计cpu硬件电路的时候,只需要设计加法器电路而无需设计减法器电路,极大简化了电路设计
  2. 如果你在一个byte变量上执行127 + 1,结果会溢出,得到-128
  3. 固定宽度的整数的范围可以被看作是一个环状结构,在某些时候能够加以运用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值