为什么需要码制?
计算机只认识0和1,但我们需要表示正数和负数。码制就是用来解决"如何在计算机中表示有符号数"的问题。
三种码制的通俗理解
1.原码 - "最直接的想法"
就像我们日常写数字一样直接:
最高位表示符号:0=正数,1=负数
其余位表示数值的绝对值
例子(8位二进制):
+5 的原码:00000101
-5 的原码:10000101
问题:计算时很麻烦!
00000001 (+1)
- 10000001 (-1)
= 10000010 (-2) ❌ 结果错误!
2.反码 - "第一次改进"
负数的反码 = 原码的数值位取反(符号位不变)
例子:
+5 的反码:00000101(与原码相同)
-5 的反码:11111010(原码10000101取反)
改进:计算比之前好一点,但仍有问题
00000001 (+1的反码)
- 11111110 (-1的反码)
= 11111111 (-0的反码) ❌ 出现了"-0"!
- 补码 - "最终解决方案" ⭐
负数的补码 = 反码 + 1
例子:
+5 的补码:00000101(与原码相同)
-5 的补码:11111011(反码11111010 + 1)
神奇之处:
00000001 (+1的补码)
- 11111111 (-1的补码)
= 00000000 (0的补码) ✅ 结果正确!
补码的核心优势:
统一了0的表示:没有+0和-0的问题
简化了运算:加减法都可以用加法器完成
增加了表示范围:能多表示一个负数(-128)
为什么程序员要理解这些?
理解整数溢出问题
调试底层程序时查看内存数据
理解位运算操作
面试常考题
现代计算机:
所有整数运算都使用补码
浮点数使用IEEE 754标准
字符使用Unicode编码
评论