原码(Sign-Magnitude)
原码是最直观的编码方式,它的最高位是符号位(0表示正数,1表示负数),其余位表示数值本身的绝对值。
- 表示
原码采用最直观的符号-绝对值表示法:
- 符号位(最高位):0表示正数,1表示负数
- 数值位(其余位):存储数二进制形式绝对值
特点:
- 表示范围:-(2^(n-1)-1) 到 +(2^(n-1)-1)
- 缺陷:存在双零问题,加减运算也需要判断符号位
2. 转换
- 正数转换:直接转换为二进制,不足位补零
- 负数转换:取绝对值的二进制形式,最高位 置1,数值位保持原值
3. 示例
十进制 | 8位原码 | 计算过程 |
+7 | 0000 0111 | 直接转换7的二进制 |
-13 | 1000 1101 | 1(符号位) + 0001101(13的二进制) |
0 | 0000 0000 | 0000 0000 或1000 0000 |
反码(Ones' Complement)
反码的表示方法对正数和原码相同,而对负数则是将其原码除符号位外的所有位取反。反码的设计初衷是为了解决原码在进行减法运算时的问题,使得任何数与其相反数相加等于零。
1. 表示
反码通过取反操作可以改进运算:
- 正数:与原码相同
- 负数:符号位保持1,数值位按位取反
特点:
- 加法需要循环进位:比如 5(0101) + (-2)(1101) = 1 0010 → 0011(3)
- 表示范围和原码相同,也就是说仍存在双零的缺陷
2. 示例
十进制 | 原码 | 反码 | 转换过程 |
+9 | 0000 1001 | 0000 1001 | 正数保持原码 |
-6 | 1000 0110 | 1111 1001 | 符号位1,数值位0110取反 |
0 | 0000 0000 | 1111 1111 | 仍然存在双零问题 |
补码(Two’s Complement)
补码是目前计算机系统中普遍采用的编码方式,因为它能简化加法和减法的硬件实现。正数的原码、反码、补码三者相同,而负数的补码则是在其反码的基础上加1。补码的引入,解决了负零的问题,并且能够多表示一个最小值。
- 表示
补码有如下公式(数字定义):
特点:
- 单零表示:0的补码唯一(00000000)
- 运算简便:A - B = A + (-B)补
- 范围:能比原码和补码多表示一个最小值
2. 转换
- 普通方法
原码 → 补码:
正数:保持原码不变
负数:转换为反码后+1
- 公式计算法
整数补码 = x
负数补码 = 2^n - |x|
3. 示例
十进制 | 原码 | 反码 | 补码 | 计算验证 |
+19 | 0001 0011 | 0001 0011 | 0001 0011 | 直接保留原码 |
-7 | 1000 0111 | 1111 1000 | 1111 1001 | 反码(11111000)+1 |
-128 | 无法表示 | 无法表示 | 1000 0000 | 2^8 - 128 = 128 |
移码
移码一般用来比较大小,比如浮点数的阶码会用移码表示,通过移码的表示,较出大小变得简单直观。
1. 表示
移码通过偏移量解决指数比较问题:
- 统一公式:移码 = 真值 + 偏移量(通常为2^(n-1))
- IEEE754 标准中 偏移量为移码形式:单精度 127(8位),双精度 1023(11位)
2. 转换
1. 确定偏移量:一般为 2^(k-1),k为位数
2. 计算移码值:E = 真值 + 偏移量
3. 示例
真值 | 8位移码(偏移127) | 计算过程 | 二进制 |
+23 | 150 | 23 + 127 = 150 | 1001 0110 |
-5 | 122 | -5 + 127 = 122 | 0111 1010 |
0 | 127 | 0 + 127 = 127 | 0111 1111 |
4. 扩展 —— 浮点中移码的应用
以单精度浮点数 1.25×2^5 为例:
- 指数真值:5
- 移码表示:5 + 127 = 132 → 10000100
- 完整编码:0 10000100 01000000000000000000000