视频加载失败

课程

2553 字
约 8 分钟

一补数与二补数 (1's Complement and 2's Complement)

逻辑设计notes/相关知识·更新于 2026-09-15

一补数与二补数 (1’s Complement and 2’s Complement)


什么是二补数

二补数 (2’s complement) 是一种用二进制表示有符号数的方法,也是一种将数字的正负号变号的方式,常在计算机科学中使用。

一个数字的二补数就是将该数字作按位反向运算(即一补数),再将结果加 1,即为该数字 of 二补数。在二补数系统中,一个负数就是用其对应正数的二补数来表示。

优点

二补数系统的最大优点是可以在加法或减法处理中,不需要因为数字的正负而使用不同的计算方式。只要一种加法电路就可以处理各种有符号数加法,而且减法可以用一个数加上另一个数的二补数来表示,因此只要有加法电路及二补数电路即可完成各种有符号数加法及减法,在电路设计上相当方便。

特点

二补数系统的 0 只有一个表示方式,这点和一补数系统不同(在一补数系统中,0 有两种表示方式),因此在判断数字是否为 0 时,只需要比对一个不同的条件即可。


补数和负数

Note

整理补充全面关于补数和负数的知识。(转自:【The Life, The Code】)

补数表示法

  1. 补数的意义:在计算机执行算术运算时,对于减法运算,为了求简化电路的设计起见,均使用补数 (Complement) 的原理,使减法运算利用补数及加法运算来取代。

  2. 补数的定义:对任一以 bb 为基底 (Base, Radix) 的非负数 NN,存在有二种补数表示法,即 bb 的补数(bb‘s 补数)及 b1b-1 的补数((b1)(b-1)‘s 补数),分述如下:

    a. bb‘s 补数定义

    NN 为一以 bb 为基底的非负数,设其整数部分含有 nn 位,小数部分含有 mm 位,则 NNbb‘s 补数定义为:

    {bnN(N0)0(N=0)\begin{cases} b^n - N & (N \neq 0) \\ 0 & (N = 0) \end{cases}

    注:此定义可避免出现两种不同的表达式来代表 0。

    :若一正数 N=31.4N=31.4,且基底 b=9b=9,则其 9’s 补数可如下求出: :由题意知整数部分 n=2n=2,小数部分 m=1m=1,代入公式可得: 9231.4=(100)9(31.4)9=(57.5)99^2 - 31.4 = (100)_9 - (31.4)_9 = (57.5)_9

    b. (b1)(b-1)‘s 补数定义

    NN 为一以 bb 为基底的非负数,设其整数部分含有 nn 位,小数部分含有 mm 位,则 NN(b1)(b-1)‘s 补数定义为: bnbmNb^n - b^{-m} - N 注:此定义并未针对 N=0N=0 特殊处理,因此会产生不同的 0 的表达式,造成混淆。

    :如上例,正数 N=31.4N=31.4,基底 b=9b=9,则 8’s 补数可如下求出: :由题意知整数部分 n=2n=2,小数部分 m=1m=1,代入公式可得: 929131.4=(100)9(0.1)9(31.4)9=(57.4)99^2 - 9^{-1} - 31.4 = (100)_9 - (0.1)_9 - (31.4)_9 = (57.4)_9

    c. 简易求补数方法

    根据上述定义,任何补数均可求得,唯需代公式求算嫌繁琐;因此一般均有较速简易的求补数方法:

    • (i) (b1)(b-1)‘s 补数求法:将每一位以 (b1)(b-1) 减去其值,即可得 (b1)(b-1)‘s 补数。
    • (ii) bb‘s 补数求法:将 (b1)(b-1)‘s 补数的最小一位加 1 即可得 bb‘s 补数。 b’s 补数=(b-1)’s 补数+(最小位加 1)\text{b's 补数} = \text{(b-1)'s 补数} + (\text{最小位加 1}) 注:二进制数值求 1 的补数,只要将原来数值中为 1 的改为 0,为 0 的改为 1,便可得 1 的补数;至于 2 的补数则只需将 1 的补数值的最小位加 1 即可。

    范例:计算二进制数之 1’s 补数及 2’s 补数:

    1. 101010121010101_2
      • 1’s 补数:010101020101010_2
      • 2’s 补数:010101120101011_2
    2. 10000210000_2
      • 1’s 补数:01111201111_2
      • 2’s 补数:10000210000_2

负数表示法

假设有一正数 XX 其在二进制数字系统中表示如下: X=0Xn2Xn3X1X0X = 0X_{n-2}X_{n-3} \dots X_1X_0 其中最高位符号位 0 代表此值为正数,Xn2Xn3X1X0X_{n-2}X_{n-3} \dots X_1X_0 表示此正数在计算机中的二进制值。 注:正数只有上述一种唯一的表示法。

在计算机中,常见的负整数表示法有以下三种:

  1. 符号大小值法 (Sign Magnitude)
  2. 一补数法 (1’s complement)
  3. 二补数法 (2’s complement)

分述如下:

(1) 符号大小值法

X=1Xn2Xn3X1X0-X = 1X_{n-2}X_{n-3} \dots X_1X_0 其中最高位符号位 1 代表此数为负数,此种表示法正数与负数之间只有最高位符号位不同。

(2) 一补数法

此法是将二进制值(包含最高位符号位)按位取反(求一补数): X=1Xn2Xn3X1X0-X = 1X'_{n-2}X'_{n-3} \dots X'_1X'_0

(3) 二补数法

此法是将二进制值(包含最高位符号位)求二补数: X=1Xn2Xn3X1X0+00001-X = 1X'_{n-2}X'_{n-3} \dots X'_1X'_0 + 00 \dots 001

注:符号大小值法及一补数法有 +0+00-0 的区别,而二补数法没有区别。

Profile Image of the Author
Sonder
好想要技术
这是公告标题
这只是一个公告
分类
标签
站点信息
构建平台
GitHub Actions
博客版本
Firefly v6.16.7
文章许可
CC BY-NC-SA 4.0
文章目录