Note: 原反补码表示: 合法表示范围, 如补码的最大值2^n-1为什么会有个-1?
背景: 学习关于 n+1 bit 带符号整数的合法表示范围(如下图)
笔记缘由: 产生了疑惑, 不能自解

- 机器数 = 无符号数(不包含符号位, 所有位都用于表示数值的大小, 表示范围非负) + 有符号数(原、反、补、移码)
- 原码: 用数值部分表示真值的绝对值, 符号位 "0/1" 对应 "正/负"
- 真值 = 符号位 + 数值位 = 若机器字长为 n+1 位, 则数值部分(尾数)占 n 位
疑惑一
: 实在是不理解补码范围里 2^n-1 的这个"-1"剔除的到底是什么? 换种问法即, 为什么范围不是对称的?
疑惑二
: 网上很多的说法是剔除掉的是+0, 个人觉得很敷衍, 类比, 因为原码、反码的范围是双边都有"-1", 难道是同时剔除掉+0和-0了?
学习这个👉 byte的范围为何是[-128, 127], 而不是[-127, 128]?
疑惑一
:
(1) 带入到具体的例子, 比如byte, 其最大值2^n-1的"-1"来源只是因为最大值是127, 先有最大值是127, 才有表示127需要用到的"-1";
(2) 不对称的原因是计算机做减法的思路(减一个数等于加上它的补数), 导致-128和128(
0-128=0+(256-128)=128[1000 0000], 但实际结果应该是-128, 所以把补码[1000 0000]让位给-128
)只能存在一个, 且最终存在的是-128
已知: 实际编程中, 计算机内存数值存储方式是补码. 所以byte的取值范围是代的是总结表格中的补码范围公式=[-2^7, 2^7-1], 而不是[-(2^7-1), 2^7-1]
由: 3.2"为什么是-128~127, 而不是-127~128了?" 扩展思考: 0-127的结果?(以计算机减法思路书写)
0-127=0+(256-127)=129=127[0111 1111]+2 =[1000 0001]=-127
疑惑二
:
同上, 是结果倒推的(
比如, 7+1 bit 的最大值 = 数值部分7位可表示出的最大值
= N111 1111 = 2^7 + 2^6 + 2^5 + 2^4 + 2^3 + 2^2 + 2^1 + 2^0 = 127 = 2^7-1
), 不用考虑什么正负0
Plus: 一道牛客 Java 基础选择题:
执行以下程序代码
char chr = 127;
int sum = 200;
chr += 1;
sum += chr;
后, sum的值是(?)
备注: 同时考虑C/C++、Java的情况的话
解: 72(C/C++)、328(Java)
Java中, char占用2个字节, 所以执行 chr += 1; 之后不会溢出;
chr += 1; // 128
sum += chr; // 200+128=328
但是对于C/C++, 会发生溢出(记住计算机计算使用的是补码)
chr += 1; // 127=0111 1111 -(+1)-> 1000 000=-128
sum += chr; // 200+(-128)=72
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)