补码0x80、0x8000的原码

解释

这是补码表示法的一个例外,即当符号位为1而数值位全部为0时,它表示整数-2^(n-1),此时符号位的1既表示负号又表示数值。

0x80的八位补码表示法的原码为1'1000'000=-128(最高位是符号位)

0x80的十六位补码表示法的原码为1'1000'000'000'000=-32768

补码的计算

如果机器字长为8(8个二进制表示一个数),则

  • 原码:最高位是符号位,其余位是数值位
  • 反码:原码的符号位不变,数值位取反
  • 补码:反码+1

注意

  1. 原码、反码、补码都是为了表示有符号数。
  2. 正数的原码、反码、补码都一样,负数的原码、反码、补码各不同。所以接下来只讨论非正数
  3. 数值0的原码、反码有两种表示方法,补码只有一种表示方法。(0的原码:0000'0000、1000'0000,0的反码:0000'0000、1111'1111,0的补码:0000'0000)
  4. 补码表示是唯一的,所以补码0x80=1000'0000肯定不是0。

方法1

以-1为例

-1的原码是(最高位是符号位,低位是数值)

1000'0001,

-1的反码是(符号位不变,数值位取反)

1111'1110

-1的补码是(反码+1)

1111'1111

问题来了

怎么从补码计算原码?

答案是(反码+1)

1111'1111的反码:1000'0000

1111'1110的补码=反码+1=1000'0000+1=1000'0001

结论

补码的补码是原码

验证

以-2、-3为例

-2原码:1000'0010,反码:1111'1101,补码:1111'1110

1111'1110反码:1000'0001,补码:1000'0010=-2

-3原码:1000'0011,反码:1111'1100,补码:1111'1101

1111'1101反码:1000'0010,补码:1000'0011=-3

计算补码0x80的原码

0x80=1000'0000,反码:1111'1111,

可以看到计算补码时产生了进位,所以把数值扩展到八位(最高位还是符号位)

补码:1'1000'0000=-128

方法2

补码的引入是为了用加法计算减法。

可以看成只能显示个位的计算器,加号键还是坏的

这种情况下怎么做减法运算呢?

以计算5-3为例

想到可以用加法的方式:5+7=2(十位显示不出来)

那么就称7是-3的补码。

补码怎么计算

首先,引入模的概念,模=数值最大值+1

这种情况下,模=9+1=10

补码就好定义了,补码的数值=模-减数

-1的补码值是10-1=9;

-2的补码值是10-2=8;

...

-8的补码值是10-8=2;

-9的补码值是10-9=1;

二进制的补码

八位二进制为例。最高位为符号位,低七位是数值数,则模=111'1111+1=1000'0000=128

那么-3的补码值就是128-3=125,加上符号位就是补码,二进制表示为1111'1101

测试一下:10-3=0000'1010+1111'1101=0000'0111=7

这就实现了减法的计算

补码0x80的原码

因为补码的补码是原码

那么0x80=1000'0000,符号位是1表示为负数,数值位等于0,其补码就是1000'0000-0=128,所以0x80的原码是-128

参考

《软考教程 嵌入式系统设计师教程(第2版)》【摘要 书评 试读】- 京东图书

原码、反码、移码和补码_0x80的反码-CSDN博客

论补数和补码的关系-CSDN博客

根据补码求原码-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值