原码、反码、补码的转换
定义
- 原码:符号位加上真值的绝对值(即:最高位为符号位,0正1负,其余位为数值)。
- 反码:
- 正数:与原码相同。
- 负数:符号位不变,其余各位(数值位)按位取反。
- 补码:
- 正数:与原码相同。
- 负数:在反码的最低位加 1。
例子
假设字长为 4 位:
1. 正数(例如 +2)
- 原码:
0010 - 反码:
0010(正数不变,千万不要取反) - 补码:
0010(正数不变,也不要加 1)
2. 负数(例如 -2)
- 原码:
1010(最高位变1,表示负) - 反码:
1101(符号位1不动,后面的010变成101) - 补码:
1110(反码1101+1=1110)
二进制补码计算方法
计算补码表示的数值大小时,最关键的是首先看最高位(最左边第一位)。
核心步骤
-
看最高位(符号位):
- 如果是 0:表示正数。直接算。
- 如果是 1:表示负数。需要“取反加一”求出绝对值,最后加负号。
-
负数的计算公式:
- 步骤: 先把每一位取反(0变1,1变0),然后结果加 1。算出这个新数的十进制大小,就是该负数的绝对值。
例子 1:正数的情况(最简单)
假设字长为 8 位,二进制补码:0000 1101
- 检查符号位: 最高位是
0,这是正数。 - 直接计算:
- 对应位权值相加:8 + 4 + 1 = 13
- (第3位是1,代表8;第2位是1,代表4;第0位是1,代表1)
- 结果: +13
例子 2:负数的情况(经典例子)
假设字长为 8 位,二进制补码:1111 0101
- 检查符号位: 最高位是
1,这是负数。 - 求绝对值(取反加一):
- 第一步(取反): 将
1111 0101每一位反过来 → 变成0000 1010 - 第二步(加一):
0000 1010+1→ 变成0000 1011
- 第一步(取反): 将
- 计算大小:
0000 1011换算成十进制:8 + 2 + 1 = 11
- 加上负号:
- 结果是 -11
例子 3:位数较少的负数
假设字长为 4 位,二进制补码:1110
- 检查符号位: 最高位
1,是负数。 - 求绝对值:
- 取反:
1110→ 变成0001 - 加一:
0001+1→ 变成0010
- 取反:
- 计算大小:
0010是十进制的 2。
- 结果: -2
例子 4:特殊的最小负数
假设字长为 8 位,二进制补码:1000 0000
- 检查符号位: 最高位
1,是负数。 - 特殊情况:
- 按照规则取反得到
0111 1111,加 1 后变成1000 0000(也就是128)。 - 这是补码的特殊规定:
1后面全0,表示该位宽能容纳的最小负数。
- 按照规则取反得到
- 结果: -128

浙公网安备 33010602011771号