揭开补码的神秘面纱

揭开补码的神秘面纱

1.补码本身具有幂等性:该特性决定我们虽然运算使用补码,但是通过两次补码可以回到原码;

((X)补)补=X
a+b=(a补+b补)补
幂等性:相同操作重复执行,并能获得相同结果。这些操作不会影响系统状态,也不用担心重复执行会对系统造成改变。比如原码的补码再进行补码操作就会回到原码。

2.补码解决了正0 负0的二义性,使0的表示得到统一;

正零:00000000
负零:10000000
这两个数其实都是0,但他们的原码却有不同的表示。
但是他们的补码是一样的,都是00000000
二义性:一条术语拥有不止一条含义,类似一语双关。

3.那8位二进制有符号整数能表示的最大范围是多少呢?

如果按照原码进行表示,1111 1111 ~0111 1111 即:
-127 到+127 再加一个0 ,255个数字;
但是书上又明说8位二进制有符号整数的范围是:-128 到+127,即 -2(n-1)到2(n-1)-1
这又是为什么?
原因就是计算机运算时使用补码进行的,
1000 0000 这个数字被强制规定就是-128的补码:-128+1=-127
(1000 0000 )补+(0000 0001)补=1000 0001
-127的补码就是1000 0001 ,符合运算规律;
故n位有符号数表示的范围是: -2^(n-1) 到 2^(n-1)-1
故n位无符号数表示的范围是:0 到2^n-1
8位二进制有符号数中:-128是没有原码的,其原码不存在;原码中有两个0,即+0和-0

4.CPU将加,减法统一为加法运算;

[a-b]补=a补+(-b)补

5.使符号位能与有效值部分一起参加运算,从而简化运算规则。

补码机器数中的符号位,并不是强加上去的,是数据本身的自然组成部分,
可以正常地参与运算。CPU并不知道正负,使其能够按照和无符号数一致的运算规则进行处理

6.补码使二进制的加、减、移位等操作和十进制具有相同的运算规

continuing…

7.负数-a实际上使用0-a结果,通过二进制运算0-a就是-a的补码,由此可见定义补码就是要求所有算术运算符合现有的运算规

补码意义:

所以补码的设计目的是
⑴ 使符号位能与有效值部分一起参加运算,从而简化运算规则。补码机器数中的符号位,并不是强加上去的,是数据本身的自然组成部分,可以正常地参与运算。
⑵ 使减法运算转换为加法运算,进一步简化计算机中运算器的线路设计。
所有这些转换都是在计算机的最底层进行的,而在我们使用的汇编、c等其他高级语言中使用的都是原码。
CPU对于补码完全不知情,其只按照指令机械的按照电路设计进行工作,并对某些溢出标志位进行设置;
所有的逻辑由编译器来决定,处理的数是有符号数还是无符号数,有符号数出现溢出怎么处理,这些在编译时已经确定;
编译器送给机器的机器代码中:负数已经进行补码编码,同时编译器负数对负数结果进行转换为原码或十进制数据显示给用户;

哈姆雷特,请保持进步!

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值