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

posted @   LinForest_zZ  阅读(32)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示