[分享]带符号数的表示-----补码

补 码 表 示

由于原码表示中0的表示形式的不唯一和原码加减运算的不方便,造成实现原码加减运算的硬件比较复杂.为了简化运算

让符号位也作为数值的一部分参加运算,并使所有的加减运算均以加法运算来代替实现,人们提出了补码表示方法.

1 . 模 的 概 念

补码表示的引入是基于模的概念. 所谓"模"是指一个计数器的容量,比如钟表以12为一个计数循环,既可以看做以12

为模.在进行钟表对时时,设当前钟表的时针停在 9 点钟位置,要将时针拔到4点钟.可以采用两种方法: 一是反时针方向

拔动指针,使时针后退5个小时,即 9 - 5 = 4 ; 另一种是顺时针方向拔动指针,使时针前进7个小时,也能够使时针指向

4. 这是因为表钟的时间只有 1,2,.....,12 这12个刻度,时针指向超过12时,将又指向1,2,........,相当于每超

过12,就把12丢掉. 由于9+7=16,超过了12,因此把12减掉后得到4, 即用 9+7 也同样能够将表钟对准到4点钟. 这样,

对于采用12为模的钟表而言, 9-5 ≡ 9+7 ( mod 12 ) ,称为在模12的条件下,9-5等于9+7. 这里, 7 称为 -5 对 12

的补数, 既 7 = [-5]补 = 12 + (-5) (mod 12) .这个列子说明,对某一个确定的模而言,当需要减去一个数X时

,可以用加上 X 对应的负数 -X 的补数 [-X] 补来代替.

对于任意X,在模M的条件下的补数[X]补,可由下式给出:

[X]补 = M + X (mod M)

根据公式:

1.当 X>=0 时, M+X大于M,把M丢掉,得[X]补=X,既正数的补数等于其本身.

2.当 X<0 时 ,[X]补=M+X=M-|X|,既负数的补数等于模与该数绝对值之差.

例: 求模M=2时,二进制数X的补数

(1)X=+0.10110101 (2)X=-0.10110101

解: (1)因为X>=0,把模2丢掉,所以 [X]补 = 2+X = 0.10110101 (mod 2)

(2)因为X<0 ,所以 [X]补 =2+X

=2-|X|

=10.00000000-.010110101

= 1.01001011(mod 2)

2. 补 码 的 定 义

在计算机中,由于硬件的运算部件与寄存器都有一定的字长限制,既计算机硬件能够一次处理的二进制数据的长度

是有限的,因此计算机中的运算也是有模运算.例如一个位数为8的二进制计数器,计数范围为00000000-11111111,当计数

满到11111111时,再加1,计数值将达到100000000,产生溢出,最高位的1被丢掉,使得计数器又从00000000开始计数.对于

这个8位二进制计数器而言,产生溢出的量100000000就是计数器的模,相当于前述钟表中的12.

由于计算机中的数据均采用二进制编码表示,因此通常将某数对模的补数称为补码.对于数值部分的位数为N的二进

制数据X,下列式字给出了X为纯小数±0.x1x2...xn和X为纯整数±X1X2....XN时的补码的表示定义.

纯小数补码的定义:

X 0 ≤ X < 1

[X]补 = (mod 2)

2+X -1≤ X < 0

纯整数补码的定义:

X 0 ≤ X <2^N

[X]补 = (mod 2^(n+1))

2^(N+1)+X -2^N ≤ X <0

根据式子可以知道:

X的补码[X]补是一个N+1位的机器数X0X1X2.....XN,其中X0是符号位,X1X2....XN为数部分,N为X数值

位的长度,并且纯小数补码表示的模M=2;纯整数补码表示的模M=2^(N+1).

例: 已知X,求X的补码[X]补.

1. X=+0.1010110 2. X=-0.1010110 3. X=+1010110 4. X=-1010110

解:通过定义可以知道:

1.[X]补 = X =0.1010110

2.[X]补 = 2+X = 10.0000000+(-0.1010110) = 1.0101010

3.[X]补 = X =1010110

4.[X]补 = 2^7+X = 10000000+(-1010110) = 10101010

可得:X0是符号位,X>=0,X0=0;X<0,X0=1.

3. 特 殊 数 的 补 码 表 示

(1)真值0的补码表示

真值0的补码表示是唯一的:

[+0]补 = [-0]补 = 2±0.00....0 = 0.00...00 (纯小数)

[+0]补 = [-0]补 = 2^(N+1)±0.00....0 = 0.00...00 (纯整数)

(2) -1 和 -2^N 的补码表示

在纯小数补码表示中,[-1]补 = 2 + (-1) = 10.00....0 + (-1.00...0) = 1.00...0

在纯小数的原码表示中,[-1]原 是不能表示的; 而在补码表示中,纯小数的补码最小可以表示到-1,这时

在[-1]补中,符号位的1既表示符号"-",又表示数值1.

在纯整数表示中有:

[-2^N]补 = 2^(N+1) + (-2^N) = 1000...0(N+1个0) + (-100..0)(N个0) = 100..0(N个0)

同样,在纯整数的原码表示中,[-2^N]原 是不能表示的;而在补码表示中,在模为2^(N+1)的条件下.纯整数的补码

最小可以表示到-2^N.这时,符号位的1既表示符号"-",也表示数值2.

4. 补 码 的 简 求 法

给一个X,若:

(1) X>=0; 则 [X]补 = X, 并使其符号位为0.

(2) X <0; 则将X的各位取反,然后在最底位上加1,并使符号位为1,既得到[X]补.

证明:

设X为纯小数,根据定义式有:

当 X = +0.X1X2...XN 时, [X]补 = X =0.X1X2....XN,这时符号位为0,表示X>=0;

当 X = -0.X1X2...XN 时, [X]补 = 2+X

= 2 - 0.X1X2...XN

= 1.11...1+0.00...1 - 0.X1X2...XN

= 1.X1X2..XN + 0.00...1

所以当X<0时,将X的各位取反,再在最底位上加1,既可求的X的补码[X]补.

纯整数的补码也可以采用同样的简便方法求得,大家自己证明一吧.

例: 用简便方法求出下列X的补码.

1. X=+0.1010110 2. X=-0.1010110

解: 1. ∵X>=0 ∴[X]补 = X = 0.1010110

2. ∵X<0 ∴将X的各位取反得 1.0101001,再在最底位加1,得 [X]补 = 1.0101001+0.0000001

= 1.0101010

5. 补 码 的 几 何 性 质

根据补码的定义,可以得到补码的几何性质.下面以N=3的整数为例,说明补码的几何性质.N=3的所有整数的补码

如下表

真值 补码 真值 补码

+000(+0) 0000 -001(-1) 1111

+001(+1) 0001 -010(-2) 1110

+010(+2) 0010 -011(-3) 1101

+011(+3) 0011 -100(-4) 1100

+100(+4) 0100 -101(-5) 1011

+101(+5) 0101 -110(-6) 1010

+110(+6) 0110 -111(-7) 1001

+111(+7) 0111 -1000(-8) 1000

将这个表中的数的真值与补码反映在数轴上就可以看到补码的几何性质,如下图(如果看不清楚就直接点图)

图片附件: 游客没有浏览图片的权限,请 登录 或 注册

补码的几何性质说明了以下2点:

一: 整数的补码就是其本身,负数表示的实质是把负数映像到正值区域,因此加上一个负数

或减去一个正数可以用加上另一个数(负数或减数对应的补码)来代替`

二: 从补码表示的符号看,补码中符号位的值代表了数的正确符号0正,1负;而从映像值

看,符号位的值是映像值一个位数,因此在补码中,符号位可以与数值一起参加运算.

6. 补 码 的 几 个 关 系

(1) 补码和原码的转换关系

若X>=0, 则[X]原=[X]补.

若X<0 , 则将[X]原除符号位以外的各位取反后,再在最底位上加1,即可得到[X]补;反之将[X]补除符号位以外

的各位取反后,再在最底位加1,即可得到[X]原.

例: 将以下X的原码表示转换为补码表示.

1. [X]原 = 0.1010110 2. [X]原 = 1.1010110 3. [X]原 = 01010110 4. [X]原 = 11010110

解: 1. ∵X>=0; ∴[X]补 = 0.1010110

2. ∵X<0 ; ∴[X]补 = 1.0101010

3. ∵X>=0; ∴[X]补 = 01010110

4. ∵X<0 ; ∴[X]补 = 10101010

可以看出一个规律: 当X<0时,保持原码的符号位不变,从[X]原的最低位开始向高位扫描,在遇到第一个1之后,保持

该位1和比其低的各位不变,将其余位变反,即可得到[X]原对应的补码.

(2) 补码与机器负数的关系

如前所述,在模 M 的条件下,当要减去一个数X时,可以用加上 X 对应的负数的补码数 [-X]补来替代.通常把

[-X]补 称为机器负数,把由[X]补求[-X]补的过程称为对[X]补求补或变补.在补码运算过程中常需要在已知[X]补的条件

下求[-X]补.对[X]补求补的规则是: 将[X]补的各位(含符号位)取反,然后在最底位加1,即得到[-X]补.反之亦然.

例: 已知[X]补,求[-X]补.

1. [X]补 = 01001101 2. [X]补 = 10110011

解:根据规则可得: 1. [-X]补 = 10110011

2. [-X]补 = 01001110

(3) 补码的左移动和右移

移位规则:

1.补码的左移,符号位不变,数值部分左移,最底移出的空位填0.

2.补码的右移,符号位不变,最高移出的空位填补与符号位相同的代码.

例: 已知[X]补,求[2X]补和[1/2]补.

1. [X]补 = 0.0101001 2. [X]补 = 11011010

解: 1. [2X]补 = 0.1010010 左移后,符号位不变,数值最高位移出,最底填0.

[1/2]补 = 0.0010100 右移后,符号位不变,数值最高位填补与符号位相同的0,末尾1被移出

2. [2X]补 =10110100 左移后,符号位不变,数值最高位移出,最底填0.

[1/2]补 = 11101101 右移后,符号位不变,数值最高位填补与符号位相同的1,末尾0被移出

在左移过程中,注意不要将高位的有效数值位移出.否则回出错.例如,将8位纯整数补码[X]补 = 01011010 进行左移时

,需要将数值最高位的1移出,如果将数值1移如符号位,则回造成符号错误,既将正数的补码变成了负数的补码;然后如果将

1丢掉,又将失去最高位的有效数值,造成出错.同理,如果要将8为纯整数补码[X]补 = 10011010 进行左移,也回出现同样

的错误.

7. 补 码 的 特 点

1. 在补码表示中,用符号位X0表示数值的正负,形式与表示原码相同,既0表示正1表示负.但是补码的符号可

看做是数值的一部分参加运算.

2.在补码表示中,数值0只有一种表示方法,既00...0.

3.负数补码的表示范围不负数原码范围略宽,纯小数的补码表示到-1,纯整数的补码可以表示到-2^N.

由于补码表示中的符号位可以与数值位一起参与运算,并且可以将减法转换为加法进行运算,简化了运算过程,

因此计算机中均采用补码进行加减运算.

好累```一个字``````````````````休息

[此贴子已经被作者于2007-9-1 14:53:05编辑过]

2g2Zgxi1.jpg

(72.95 KB)

图片附件: 游客没有浏览图片的权限,请 登录 或 注册

c语言中有符号数的补码,[分享]带符号数的表示-----补码相关推荐

  1. C语言中有符号数和无符号数的问题

    C语言中有符号数和无符号数的问题 项目说明     考虑下列代码, 这段代码试图计算数组a中所有元素的和, 其中元素的数量由参数length给出: /* WARNING: This is buggy ...

  2. c语言 有符号数与0作比较大小,C语言中有符号数与无符号数能否进行比较运算...

    无符号数和有符号数是不能进行比较运算的,否则可能会出现意想不到的错误,且极难检查出来! 首先肯几个例子(假设在32位的机器上): 1         1. 0 == 0U 2         2. - ...

  3. java中有符号数和无符号数,C语言中无符号数和有符号数之间的运算

    C语言中有符号数和无符号数进行运算(包括逻辑运算和算术运算)默认会将有符号数看成无符号数进行运算,其中算术运算默认返回无符号数,逻辑运算当然是返回0或1了. unsigned int和int进行运算 ...

  4. 计算机中有符号数为什么规定0为正,1为负?而且为了方便数值比较大小,甚至引入移码【就是在补码的基础上,符号位取反而已】。那么问题来了,为什么不一开始就规定1为正,0为负呢?

    计算机中有符号数为什么规定0为正,1为负?而且为了方便数值比较大小,甚至引入移码[就是在补码的基础上,符号位取反而已].那么问题来了,为什么不一开始就规定1为正,0为负呢? 由上图知,移码在数值比较上 ...

  5. 对verilog中有符号数和无符号数的理解

    文章目录 对verilog中有符号数和无符号数的理解 对verilog中有符号数和无符号数的理解 ​ verilog中使用signed表示有符号数,比如: wire signed [7:0] din; ...

  6. C语言有符号数和无符号数的判断方法

    title: C语言有符号数和无符号数的判断方法 date: 2019-2-12 15:39:26 tags: C 学完CSAPP有符号数和无符号数的部分后冒出了这个问题,在网上查找资料后总结下.应用 ...

  7. 计算机组成原理——有符号数的原码、反码、补码、移码

    目录 原码 浮点数和定点数 无符号数/有符号数的定点表示 原码 反码 补码 作用 移码 作用 原码 浮点数和定点数 定点数:小数点的位置固定 如:13.24                   --常 ...

  8. 计算机有符号数加法,有符号数的表示法、加减法、补码

    有符号数的表示法.加减法.补码 摘要:本文将会说明有符号数的表示方法,有符号数正负数之间的跳变,有符号负数的加减法,为什么采用补码等方面进行分析. 我是学过计算机原理的,也有有符号数和无符号数的概念, ...

  9. 计算机中有符号数的表示

    文章目录 二进制数制 十进制 二进制 位模式 基本数据类型 无符号数的编码 有符号数的编码 原码(Sign-Magnitude) 反码(Ones' Complement) 补码(Two's Compl ...

最新文章

  1. python编程问题--第二次
  2. 【机器学习入门到精通系列】异常检测
  3. Java笔记-非对称加密RSA的使用
  4. Jenkins-Pipeline 流水线发布
  5. Mysql字符串连接
  6. 创业团队如何在低成本的情况下保护网站安全
  7. [转载] MLDN魔乐科技李兴华主讲Oracle——01 Oracle简介
  8. A very hard mathematic problem HDU - 4282(二分)
  9. [总结] 单颗粒分析(SPA, Single particle analysis)
  10. 如何高效优雅地下载CMIP6模式数据
  11. 阿里云API网关使用教程
  12. 验证邮箱格式html代码,jquery验证邮箱格式是否正确实例讲解
  13. 大数据工程师、BI工程师、数据库工程师什么区别?
  14. 基本算法总结,力扣题目整理
  15. 番外11:使用ADS对射频功率放大器进行非线性测试3(使用带宽5MHz的WCDMA信号进行ACLR测试)
  16. linux上json文件格式化的查看工具jq
  17. BannerStudio---2021年旗帜软件工作室年会总结
  18. 算法笔记_227:填写乘法算式(Java)
  19. C语言报名里面培训怎么填,庄河c语言编程学习,庄河学c语言编程培训,庄河学c语言编程报个培训班怎么样...
  20. 123457123456#2#----com.MC.ShiZi365--前拼后广--儿童识字Game-mc22222222222222222

热门文章

  1. 经方时方接轨之――茵陈蒿汤合甘露饮
  2. 滴滴D1上路之后,科技巨头正在“抢滩登陆“造车战场
  3. 峰会•沙龙•招聘 | 记零数科技多线并进的一天
  4. android studio中崩溃无法查看log?
  5. 这样设置定时消息通知提醒,重要的信息肯定不会错过
  6. git提交代码出现 fatal: The remote end hung up unexpectedly-错误处理
  7. 初步认识计算机网络的结构特点
  8. 【软件测试】测试用例相关知识(六大测试用例设计方法)
  9. 父爱,是一首深沉的诗。
  10. 使用Prometheus+Grafana监控MySQL