十万个为什么——为什么8bit有符号整型的范围是-128到127

本文探讨了8位有符号整数的表示范围,作者从个人疑惑出发,逐步解析了为何其范围为-128至127,并非直观的-127至127。过程中涉及补码的概念及其对负数表示的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

从谭浩强的C语言到我现在手上的这本C++ Primer Plus,几乎所有的书都是这么说的。说来惭愧,我从来没有研究过为什么是这个范围,以前每次看到这里就头疼,甚至知道考试要考也不背。

之前我也研究过,但是今天看到这里,又疑惑了。

所以,我还是没弄清楚!

先说说我的想法:

0 0 0 0 0 0 0 0

如果最前面一位用0和1来表示正负,那么剩下来的7位能表示的数,最小是0, 最大是2的七次方减一,即127。

所以, 在我的想象中,8位有符号整型的范围应该是 -127到-0,+0到+127, 其中-0和+0合并,所以范围就是 -127到127。

写到这里的时候, 我已经恍惚感觉到,可能和大一的计算机基础课“补码反码”的内容有关。

但是,我还是先百度了一下:

扫了一眼搜索结果,我首先点进了喜闻乐见的百度贴吧,发帖者显然和我有一样的困惑。

第一个回帖:

C语言吧1级贴吧大神通过数数成功让楼主懂了。这个回答显然不能让我信服。

 

第二个回帖:

 

依然在数数呀,0是正的吗?并不是:

 

最后一个回帖:

 

这位老哥毕竟是C语言吧真·13级大神,上来就指出大部分人在这个问题上错了。让我不由的精神一震。虽然他说了很多很专业的名词,x86,ARM,MIPS等等,还贴出网址,引经据典。但是我还是觉得少了点意思,不过总算给了我一点思路。

 

那么,到底是为什么呢?

我带着深深的疑惑和一丝丝感觉,点开了当时搜索出来的第一条——百度知道。

提问是:

回答是:

看到这里我就懂了,原来负整数是用补码来表示的。

我脑海中的 1 0 0 0 0 0 0 0 到 1 1 1 1 1 1 1 1 其实偷偷变成了 1 1 1 1 1 1 1 1 到 1 0 0 0 0 0 0 1 。

也许,我的理解还是有问题,不过算是暂时给我自己一个交代了哈哈。

 

经过这次探索,我明白了两个道理:

1、百度知道往往比百度贴吧靠谱得多(让我想起了十年前在百度知道问作业的时光)

2、我确实该承认我是一个没有计算机素养的切图仔,O(∩_∩)O哈哈~

 

《=========================两个小时之后的更新=====================》 

写完上面那些,我思考到现在。感觉最后那个百度知道的答案也有问题,说得也不清楚,是我想当然了!

这位老哥的算法可能是对的https://blog.youkuaiyun.com/bat67/article/details/75194627

待续

转载于:https://www.cnblogs.com/geekshine/p/9307946.html

### 关于反码相对于原码的优缺点及其被淘汰的原因 #### 反码相较于原码的优点 1. **简化加减运算逻辑** 使用反码可以使得计算机中的加法器设计更加简单。对于正数和负数之间的加减操作,可以通过统一的加法规则实现部分功能,而不需要单独处理正数和负数的情况[^2]。 2. **表示范围扩展** 虽然反码仍然存在一些缺陷,但它相比原码能够更好地支持简单的数值转换过程,并且在理论上提供了更接近实际需求的数据表达方式[^3]。 #### 反码相较于原码的缺点 1. **无法解决零的唯一性问题** 在反码体系中,存在两个不同的零值:`+0`(全0)和`-0`(最高位为1,其余位为0)。这种双重表示会引发不必要的复杂性和错误风险[^1]。 2. **不便于硬件实现高效计算** 尽管反码能够在一定程度上改进原码的设计不足之处,但在涉及复杂的数学运算时仍显得不够理想。特别是当遇到跨越零点的操作时,其表现不如后续发展的补码形式稳定可靠[^4]。 3. **缺乏对特殊值的支持** 如同提到的一样,在单字节情况下,某些极端情况下的整数值(例如−128),并不能通过标准意义上的反码来有效呈现出来。 #### 反码被取代的根本原因 随着技术进步与理论研究深入,人们发现基于补码构建起来的新一代编码方案不仅继承并优化了前两者的主要优势特性,还彻底克服了它们各自存在的局限性。具体来说: - 补码成功消除了关于“±0”的争议; - 它提供了一个连续完整的数值区间用于描述有符号整型变量; - 更重要的是,它极大地促进了现代处理器内部算术单元效率提升以及能耗降低等方面的发展成就。 综上所述,尽管反码曾经作为过渡阶段的技术产物发挥过一定作用,但由于上述种种劣势的存在加之后来更为优越替代品——即我们今天广泛采用着得补码系统的诞生与发展成熟,最终促使反码逐渐退出历史舞台成为过去式。 ```python def show_complement(num_bits, value): """展示给定长度二进制数的不同编码""" sign_bit = '0' if value >= 0 else '1' abs_val = abs(value) original_code = f"{sign_bit}{'{0:b}'.format(abs_val).zfill(num_bits - 1)}" reverse_code = ''.join(['1' if c == '0' else '0' for c in original_code]) if value < 0 else original_code complement_code = bin(int(reverse_code, base=2)+1)[2:].zfill(len(reverse_code)) if value < 0 else original_code return { "original": original_code, "reverse": reverse_code, "complement": complement_code } result = show_complement(8,-7) print(result["original"]) # 输出原码 print(result["reverse"]) # 输出反码 print(result["complement"]) # 输出补码 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值