【127+1】问题

一个字节能存储的数据范围

【无符号数】:一个字节有8位,如果全部用来表示数值,一共可以表示 2^8=256 个数 0,1,2,3,...,255

【有符号数】:如果用最高位表示符号(0表示正,1表示负),那么只剩下7位表示数值:

  1. "0000 0001" ~ "0111 1111" 表示127个正数
  2. "1000 0001" ~ "1111 1111" 表示127个负数
  3. 但是,现在还剩下 "0000 0000""1000 0000"未表示任何数,由于平时+0等于0,于是规定
    • "0000 0000" 表示 0
    • 还剩下 "1000 0000" 可以表示一个数(肯定不能是-0吧),显然应该是一个负数,而 -1 ~ -127 都已经表示了,所以用"1000 0000" 表示 -128
  4. 因此,有符号数的表示范围是:-128~127 共256个数

注:以上二进制不是反码也不是补码,均为原码

原码、反码、补码互相转换

首先注意几点:

  1. 在计算机中,数字的存储、运算都用补码进行。
  2. 并且在运算时,补码的符号位也参与运算,因为在计算机看来,这些都是数字"0"或"1", 都能参与运算。
  3. 而人要想认出这个计算结果到底是多少,就需要转化为原码才可以。

正数以及0的原码、反码、补码相同,就不多说了

负数补码与原码相互转换

将负数的【原码转为补码】,需要经历几个步骤:

假设一个8位类型的数字 -1

  1. 写出原码:符号位用1表示,如-1的原码:1000 0001
  2. 写出反码:【符号位不变】,其余各位取反,如-1的反码:1111 1110
  3. 计算补码:在反码的基础上 +1 ,如-1的补码:1111 1111

将负数的【补码转为原码】,只需要记住:“补码的补码==>原码”,也就是已知补码的情况,再计算补码的补码即还原出原码。

如:-1的补码 1111 1111 —[符号位不变,其余取反]—> 1000 0000 —[+1]—> 1000 0001

下图来源于维基百科,是几个特殊的数字的补码
image-20220614151055902

【127+1】的运算

手算

前面说过,在计算机内部,数字的存储、运算都是以补码形式进行

那么 "127+1"的运算过程如下

  1. 127 的补码是: 0111 1111

  2. 1 的补码是: 0000 0001

  3. 相加后的补码: 1000 0000 (补码运算时,符号位也参与运算)

  4. 然后,要把补码转换为人方便阅读的原码:

    1000 0000(补码) —[符号位不变,其余取反]–> 1111 1111(反码) —[+1]—> 1000 0000(原码) 。根据最前面说到的结论可知,1000 0000(原码) 不表示 -0 而表示 -128

同理,"127+2"的运算步骤:

  1. 127 的补码是: 0111 1111
  2. 2的补码是: 0000 0010
  3. 相加后的补码: 1000 0001 (补码运算时,符号位也参与运算)
  4. 相加结果转为原码: 1000 0001(补码) —> 1111 1110(反码)—> 1111 1111(原码)=-127

C程序

#include <stdio.h>

int main()
{
	char a=127, b=127;
	a+=1;
	b+=2;
    printf("计算结果:%d ,%d\n", a, b); // 输出: 计算结果:-128 ,-127
    return 0;
}

去菜鸟工具验证

image-20220614135246641

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

[小G]

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值