原码 反码 补码:修订间差异

来自牛奶河Wiki
跳到导航 跳到搜索
 
(未显示同一用户的4个中间版本)
第1行: 第1行:
原码、反码和补码是计算机中对数字的二进制表示方法。
原码、反码和补码是计算机中对数字的二进制表示方法。
# 原码:最高位为符号位,0 表示正数,1 表示负数,其余位表示数值的绝对值
# 原码:最高位为符号位,0 表示正数,1 表示负数,其余位表示数值的绝对值
# 补码:正数的补码与原码相同,负数的补码为在反码的基础上加 1(其中 -8 表达为 1000,符号位为负)
# 反码:正数的反码与原码相同,负数的反码为在原码的基础上,符号位不变,其余位取反
#反码:正数的反码与原码相同,负数的反码为在原码的基础上,符号位不变,其余位取反
# 补码:正数的补码与原码相同,负数的补码为在反码的基础上加 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. 因为补码负数是在反码的其中上加 1,所以极值的表达与正数有些许不同:
  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,为下溢出


=== 溢出 ===
补码运算时,若符号位不同:
补码运算,符号位相同,出现进位即为溢出(符号位=0,为上溢出;符号位=1,为下溢出)
*出现进位,说明结果为正
*未出现进位,说明结果为负
P.S. 符号位参加运算。


=== 补码的减法证明 ===
===补码的减法证明===


[[分类:Develop]]
[[分类:Develop]]
[[分类:Platform]]
[[分类:Platform]]

2024年8月28日 (三) 17:08的最新版本

原码、反码和补码是计算机中对数字的二进制表示方法。

  1. 原码:最高位为符号位,0 表示正数,1 表示负数,其余位表示数值的绝对值
  2. 反码:正数的反码与原码相同,负数的反码为在原码的基础上,符号位不变,其余位取反
  3. 补码:正数的补码与原码相同,负数的补码为在反码的基础上加 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

计算

计算机是以补码来对数字进行表达,好处是不用复杂的计算逻辑,只需要做取反(异或)、加法就可以了。如:

  1. 5 + 2
    = (0101) + (0010)
    = (0111)
    = 7
  2. 5 - 2
    5 + (-2)
    =(0101) + (1110)【①0010 与 1111 异或(取反)=1101, ②+1 = 1110】
    = (0011)【符号位参与计算,出现了进位】
    = 3
  3. 2 - 5
    2 + (-5)
    =(0010) + (1011)
    = (1101)
    = -3

溢出

补码运算时,符号位相同,出现进位即为溢出

  • 符号位=0,为上溢出
  • 符号位=1,为下溢出

补码运算时,若符号位不同:

  • 出现进位,说明结果为正
  • 未出现进位,说明结果为负

P.S. 符号位参加运算。

补码的减法证明