原码 反码 补码:修订间差异
跳到导航
跳到搜索
(→计算) |
(→注意) |
||
(未显示同一用户的4个中间版本) | |||
第1行: | 第1行: | ||
原码、反码和补码是计算机中对数字的二进制表示方法。 | 原码、反码和补码是计算机中对数字的二进制表示方法。 | ||
# 原码:最高位为符号位,0 表示正数,1 表示负数,其余位表示数值的绝对值 | # 原码:最高位为符号位,0 表示正数,1 表示负数,其余位表示数值的绝对值 | ||
# 补码:正数的补码与原码相同,负数的补码为在反码的基础上加 1(其中 -8 | # 反码:正数的反码与原码相同,负数的反码为在原码的基础上,符号位不变,其余位取反 | ||
# 补码:正数的补码与原码相同,负数的补码为在反码的基础上加 1(其中 -8 定义为 1000) | |||
===定义=== | ===定义=== | ||
下面以 n=4 bit 为例: | 下面以 n=4 bit 为例: | ||
第10行: | 第9行: | ||
*负数范围:[-0 ~ -7] - (1000 - 1111) | *负数范围:[-0 ~ -7] - (1000 - 1111) | ||
很明显,只能表达 15 个数字,其中 0 有两个(0,-0)。 | 很明显,只能表达 15 个数字,其中 0 有两个(0,-0)。 | ||
====反码==== | |||
*负数范围:[-1 ~ -8] - (1110 - 1111) | |||
====补码==== | ====补码==== | ||
*正数范围:同原码 | *正数范围:同原码 | ||
*负数范围:[-1 ~ -8] - (1111 - 1000)<br> -1 {原码:(1001) -> 反码(1110) -> 补码(1111)}<br> -8 {定义补码为(1000)} | *负数范围:[-1 ~ -8] - (1111 - 1000)<br> -1 {原码:(1001) -> 反码(1110) -> 补码(1111)}<br> -8 {定义补码为(1000)} | ||
可以表达 16 个数字,-8 ~ -1,0 ~ 7。 | 可以表达 16 个数字,-8 ~ -1,0 ~ 7。 | ||
P.S. | P.S. 因为反码与补码负数都是将原码的 -0 变成了 -8,所以极值的表达与正数有些许不同: | ||
正数:[ 7] 2<sup>n-1</sup>-1 | 正数:[ 7] 2<sup>n-1</sup>-1 | ||
负数:[-8] -2<sup>n</sup> | 负数:[-8] -2<sup>n</sup> | ||
=== 计算 === | ====注意==== | ||
负数范围,只有原码是 -0~-7,补码与反码都是 -1~-8: | |||
{| class="wikitable" | |||
|+ | |||
! | |||
!-0 | |||
!-1 | |||
!-2 | |||
!-3 | |||
!-4 | |||
!-5 | |||
!-6 | |||
!-7 | |||
!-8 | |||
|- | |||
|原码 | |||
|1000 | |||
|1001 | |||
|1010 | |||
|1011 | |||
|1100 | |||
|1101 | |||
|1110 | |||
|1111 | |||
| | |||
|- | |||
|反码 | |||
| | |||
|1110 | |||
|1101 | |||
|1100 | |||
|1011 | |||
|1010 | |||
|1001 | |||
|1000 | |||
|1111 | |||
|- | |||
|补码 | |||
| | |||
|1111 | |||
|1110 | |||
|1101 | |||
|1110 | |||
|1011 | |||
|1010 | |||
|1001 | |||
|1000 | |||
|} | |||
===计算=== | |||
计算机是以补码来对数字进行表达,好处是不用复杂的计算逻辑,只需要做取反(异或)、加法就可以了。如: | 计算机是以补码来对数字进行表达,好处是不用复杂的计算逻辑,只需要做取反(异或)、加法就可以了。如: | ||
# 5 + 2<br>= (0101) + (0010)<br>= (0111)<br>= 7 | #5 + 2<br>= (0101) + (0010)<br>= (0111)<br>= 7 | ||
# 5 - 2<br>5 + (-2)<br>=(0101) + (1110)<br>= (0011)【符号位参与计算,出现了进位】<br>= 3 | #5 - 2<br>5 + (-2)<br>=(0101) + (1110)【①0010 与 1111 异或(取反)=1101, ②+1 = 1110】<br>= (0011)【符号位参与计算,出现了进位】<br>= 3 | ||
# 2 - 5<br>2 + (-5)<br>=(0010) + (1011)<br>= (1101)<br>= -3 | #2 - 5<br>2 + (-5)<br>=(0010) + (1011)<br>= (1101)<br>= -3 | ||
===溢出=== | |||
补码运算时,符号位相同,出现进位即为溢出 | |||
*符号位=0,为上溢出 | |||
*符号位=1,为下溢出 | |||
补码运算时,若符号位不同: | |||
*出现进位,说明结果为正 | |||
*未出现进位,说明结果为负 | |||
P.S. 符号位参加运算。 | |||
=== 补码的减法证明 === | ===补码的减法证明=== | ||
[[分类:Develop]] | [[分类:Develop]] | ||
[[分类:Platform]] | [[分类:Platform]] |
2024年8月28日 (三) 17:08的最新版本
原码、反码和补码是计算机中对数字的二进制表示方法。
- 原码:最高位为符号位,0 表示正数,1 表示负数,其余位表示数值的绝对值
- 反码:正数的反码与原码相同,负数的反码为在原码的基础上,符号位不变,其余位取反
- 补码:正数的补码与原码相同,负数的补码为在反码的基础上加 1(其中 -8 定义为 1000)
定义
下面以 n=4 bit 为例:
原码
- 正数范围:[ 0 ~ 7] - (0000 - 0111),8 个数字
- 负数范围:[-0 ~ -7] - (1000 - 1111)
很明显,只能表达 15 个数字,其中 0 有两个(0,-0)。
反码
- 负数范围:[-1 ~ -8] - (1110 - 1111)
补码
- 正数范围:同原码
- 负数范围:[-1 ~ -8] - (1111 - 1000)
-1 {原码:(1001) -> 反码(1110) -> 补码(1111)}
-8 {定义补码为(1000)}
可以表达 16 个数字,-8 ~ -1,0 ~ 7。
P.S. 因为反码与补码负数都是将原码的 -0 变成了 -8,所以极值的表达与正数有些许不同: 正数:[ 7] 2n-1-1 负数:[-8] -2n
注意
负数范围,只有原码是 -0~-7,补码与反码都是 -1~-8:
-0 | -1 | -2 | -3 | -4 | -5 | -6 | -7 | -8 | |
---|---|---|---|---|---|---|---|---|---|
原码 | 1000 | 1001 | 1010 | 1011 | 1100 | 1101 | 1110 | 1111 | |
反码 | 1110 | 1101 | 1100 | 1011 | 1010 | 1001 | 1000 | 1111 | |
补码 | 1111 | 1110 | 1101 | 1110 | 1011 | 1010 | 1001 | 1000 |
计算
计算机是以补码来对数字进行表达,好处是不用复杂的计算逻辑,只需要做取反(异或)、加法就可以了。如:
- 5 + 2
= (0101) + (0010)
= (0111)
= 7 - 5 - 2
5 + (-2)
=(0101) + (1110)【①0010 与 1111 异或(取反)=1101, ②+1 = 1110】
= (0011)【符号位参与计算,出现了进位】
= 3 - 2 - 5
2 + (-5)
=(0010) + (1011)
= (1101)
= -3
溢出
补码运算时,符号位相同,出现进位即为溢出
- 符号位=0,为上溢出
- 符号位=1,为下溢出
补码运算时,若符号位不同:
- 出现进位,说明结果为正
- 未出现进位,说明结果为负
P.S. 符号位参加运算。