首页资讯商务会员钢材特钢不锈炉料铁矿废钢煤焦铁合金有色化工水泥财经指数人才会展钢厂海外研究统计数据手机期货论坛百科搜索导航短信English
登录 注册

按字母顺序浏览 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

热门关键字: 螺纹钢 铁矿石 电炉 炼钢 合金钢 转炉 结构钢
钢铁百科 - 钢之家

二补数发表评论(0)编辑词条

 二补数 (2's complement) 是一种用二进位表示有号数的方法,也是一种将数字的正负号变号的方式,常在计算机科学中使用。
  一个数字的二补数就是将该数字作位元反相运算(即一补数),再将结果加 1,即为该数字的二补数。在二补数系统中,一个负数就是用其对应正数的二补数来表示。
  二补数系统的最大优点是可以在加法或减法处理中,不需因为数字的正负而使用不同的计算方式。只要一种加法电路就可以处理各种有号数加法,而且减法可以用一个数加上另一个数的二补数来表示,因此只要有加法电路及二补数电路即可完成各种有号数加法及减法,在电路设计上相当方便。
  另外,二补数系统的 0 只有一个表示方式,这点和一补数系统不同(在一补数系统中,0 有二种表示方式),因此在判断数字是否为 0 时,只较比对一个不同的条件即可。
  右侧的表是在一些 8 位元二补数系统的整数。
  目录
  1 数字表示方式
  1.1 说明
  1.2 计算二补数
  1.3 特别的数字
  1.4 其他计算二补数的方法
  1.5 符号延展
  2 运算
  2.1 加法
  2.2 减法
  2.3 乘法
  数字表示方式
  说明
  二补数 十进位
  0111 7
  0110 6
  ... ...
  0010 2
  0001 1
  0000 0
  1111 −1
  1110 −2
  ... ...
  1001 −7
  1000 −8
  以下用 4 位元的二补数数字来说明二补数系统的数字表示方式。
  在表示正数和零时,二补数数字和一般二进位一样,唯一的不同是在二补数系统中,正数的最高位元恒为 0,因此4 位元的二补数正数,最大数字为 0111 (7)。
  二补数数字的负数,最高位元恒为 1,4 位元二补数的数字中,最接近 0 的负数为 1111 (-1),以此类推,因此绝对值最大的负数是 1000 (8)。
  以上的表示方式在电脑处理时格外方便,以下用以下的例子说明:
  0011 (3) + 1111 (-1) -------------- 10010
  结果 10010 似乎是错的,因为已经超过四个位元,不过若忽略掉(从左数起的)第 5 个位元,结果是 0010 (2),和我们计算的结果一样。而且若可以将二进位的 0001 (1) 变号为 1111 (-1),以上的式子也可以计算减法:3-1 = 2。
  在 n 位元的二补数加减法中,忽略第 n+1 个位元的作法在各种有号数加法下都适用(不过在判断是否溢位(overflow)时,仍然会用到第 n+1 个位元)。因此在二补数的系统,加法电路就可以处理有负数的加法,不需另外处理减法的电路。而且,只要有电路负责数字的变号(例如将 1 变换为 -1),也可以用加法电路来处理减法。而数字的变号就用计算数字的二补数来完成。
  在一般 n 位元的二进位数字中,最高有效位元(MSB) 第 n 位元代表的数字为 2n−1。不过,在 n 位元的二补数系统中,最高有效位元(MSB) 第 n 位元表示符号位元,若符号位元为 0,数字为正数或 0,若符号位元为 1,数字为负数。以下是 n 位元的二补数系统中,几个特别的数字:
  二补数 实际数字 附注
  0 111....111 2n−1-1 最大正数
  ... ...
  0 000....001 1
  0 000....000 0
  1 111....111 -1
  ... ...
  1 000....001 -2n−1-1
  1 000....000 -2n−1 绝对值最大负数
  因此,在 8 位元的二补数系统中,可以表示的最大正数为 28−1-1 = 127,可以表示的最大绝对值负数为 -28−1 = -128 
  计算二补数
  在计算二进字数字的二补数时,会将数字进行位元反相运算,再将结果加 1,不考虑溢位位元(一般情形,溢位位元会为 0),就可以得到该数字的二补数。
  以下考虑用有号数 8 位元二进位表示的数字 5:
  0000 0101 (5)
  其最高位元为 0,因为此数字为正数。若要用二补数系统表示 -5,首先要将 5 的二进位进行反相运算〔1 变为 0,0 变为 1 〕:
  1111 1010
  目前的数字是数字 5 的一补数,因此需要再加 1,才是二补数:
  1111 1011 (-5)
  以上就是在二补数系统中 -5 的表示方式。其其最高位元为 1,因为此数字确实为负数。
  一个负数的二补数就是其对应的正数。以 -5 为例,先求数字的一补数:
  0000 0100
  再加一就是 -5 的二补数,也就是 5。
  0000 0101 (5)
  简单来说,数字 a (正负数皆可)的二补数即为 -a。
  若要计算 n 位数二补数二进位对应的十进位,需要知道每位数对应的数字,除了最高位元外,其他位元的对应数字均和一般二进位相同,即第 i 位数表示数字 2i−1。但最高位元若为 1 时,其表示数字为 -2n−1,因此若用此方式计算 0000 0101 表示的数字,其结果为:
  1111 1011 (−5) = −128 + 64 + 32 + 16 + 8 + 0 + 2 + 1 = (−2^7 + 2^6 + ...) = −5
  特别的数字
  有二个数字的二补数等于本身:一个是 0,另一个为该位元可表示最大绝对值负数(即 1000...000)。
  0 的二补数计算方式(以 8 位元为例) 如下:先计算它的一补数:
  1111 1111
  再将一补数加一:
  0000 0000, 溢位位元 = 1
  忽略溢位,其结果为 0(0 是唯一计算二补数过程中会出现溢位的数字。)。因此 0 的二补数为 0。而 0 x -1 = 0,因此其二补数仍满足「数字 a 的二补数为 -a」的原则。
  若计算 1000 0000 (-128、8 位元可表示最大绝对值负数)的二补数:先计算它的一补数:
  0111 1111
  再加一就是它的二补数。
  1000 0000
  1000 0000 (-128)的二补数仍为 1000 0000 (-128)。但 -128 x -1 = 128,因此其二补数是以上规则的例外。
  其例外原因为因为 8 位元的二补数数字范围为 -128 ~ 127。128 无法以 8 位元的二补数数字表示。在计算其他位数的最大绝对值负数(即 1000...000)时,也会有类似情形。
  其他计算二补数的方法
  另一种正式计算一数字(此例中以 N 为例)的二补数 N* 的公式如下:
  <math>N* = 2^n - N</math>
  其中 N* 是 N 的补数,而 n 是数字 N 用二进位表示时需要的位数。
  以 4 位数二进位 的 5 为例:
  N (十进位) = 5, N (二进位) = 0101
  n = 4
  5 的二补数计算方式如下:
  <math>N* = 2^n - N = [2^4](base 10) - 0101 = 10000(base 2) - 0101 = 1011</math>
  以另一种较简单的方式,可以找出二进位数字的二补数:
  先由最低位元开始找。
  若该位元为 0,将二补数对应位元填 0,继续找下一位元(较高的位元)。
  若找到第一个为 1 的位元为 0,将二补数对应位元填 1。
  将其馀未转换的位元进行位元反相,将结果填入对应的二补数。
  以 0011 1100 为例(图中的 ^ 表示目前转换的数字,-表示还不确定的位数):
  原数字 二补数 0011 1100 ---- ---0 (此位元为 0) ^ 0011 1100 ---- --00 (此位元为 0) ^ 0011 1100 ---- -100 (找到第 1 个为 1 的位元) ^ 0011 1100 1100 0100 (其馀位元直接反相) ^
  因此其结果为 1100 0100
  符号延展
  十进位 4 位元二补数 8 位元二补数
  5 0101 0000 0101
  -3 1101 1111 1101
  将一个特定位元二补数系统的数字要以较多位元表示时(例如,将一个位元组的变数复制到另一个二个位元组),所有增加的高位元都要填入原数字的符号位元。在一些微处理机中,有指令可以执行上述的动作。若是没有,需要自行在程式中处理。
  在二补数系统中,当数字要向右位移几个位元时,在位移後需将符号位元再填入原位置,保持符号位元不变。以下是二个例子:
  数字 0010 1010 1010 1010 向右位移一次 0001 0101 1101 0101 向右位移二次 0000 1010 1110 1010
  而当一个数字要向左位移几个位元时,最低位元填 0,而符号位元不受位移影响。以下是二个例子:
  数字 0010 1010 1010 1010 向左位移一次 0101 0100 1101 0100 向左位移二次 0010 1000 1010 1000
  向右位移一次相当于除 2,向左位移一次相当于乘 2。利用上述的方式可以确保位移後的数字正负号和原数字相同,因为一数字乘 2 或除 2 後,不会改变其正负号。
  运算
  加法
  二补数系统数字的加法和一般加法相同,而且在运算完成後就可以看出结果的正负号,不需特别的处理。以 15 加 -5 为例:
  11111 111 (进位) 0000 1111 (15) + 1111 1011 (-5)=00001010 (10)
  由於加数和被加数都是 8 位元,因此运算结果也限制在 8 位元内。第 8 位元相加後产生的进位不考虑(因为不存在第 9 位元)的 1 被忽略,所以其结果为 10。而 15 + (-5) = 10,计算结果正确。
  在以上计算式中,可以由进位列的最左侧二个位元得知结果是否出现溢位。溢位就是数字的绝对值太大,以致於无法在指定的二进位位元个数来表示(在此例中,是超过 8 位元的范围)。若进位列的最左侧二个位元同为 0 或同为 1,表示结果正确,若是一个为 0,另一个为 1,表示出现溢位错误。也可以对此二个位元进行XOR运算,结果为 1 时,表示出现溢位错误。以下以 7 + 3 的 4 位元加法说明溢位错误的情形。
  0111 (进位) 0111 (7) + 0011 (3) ============= 1010 (−6) 结果不正确!
  在此例中,进位列的最左侧二个位元为 01,因此出现溢位错误。溢位的原因是 7 + 3 的结果 (10) 超过二补数系统 4 位元所可以表示的数字范围 -8~7。

与“IT”相关的词条

→如果您认为本词条还有待完善,请 编辑词条

词条内容仅供参考,如果您需要解决具体问题
(尤其在法律、医学等领域),建议您咨询相关领域专业人士。
0

标签: IT

收藏到: Favorites  

同义词: 暂无同义词

关于本词条的评论 (共0条)发表评论>>

您希望联系哪位客服?(单击选择)