文档章节

(转)为什么要用补码表示

来来叔叔
 来来叔叔
发布于 2017/08/04 23:57
字数 850
阅读 6
收藏 0
 用补码的主要原因:使用补码,可以将符号位和其它位统一处理;同时,减法也可按加法来处理。另外,两个用补码表示的数相加时,如果最高位(符号位)有进位,则进位被舍弃。n位计算机,设n=8, 所能表示的最大数是11111111,若再加1称为100000000(9位),但因只有8位,最高位1自然丢失。又回了00000000,所以8位二进制系统的模为2(8)。 在这样的系统中减法问题也可以化成加法问题,只需把减数用相应的补数表示就可以了。把补数用到计算机对数的处理上,就是补码[1]。
 
最直观的得到一个负数的补码的方法是用28去减它,例如:
-1 的补码 100000000
 -) 00000001
------------
= 11111111   (实际上就是1 + (11111111 – 1),先计算括号内,相当于按位取反,然后再加上外面的1。
 
首先说说无符号数的表示,一个字节可以表示28-1=256个数,00000000~11111111 分别表示0~255。这个很简单。
对于无符号数,一个字节同样只能表示256个数,那么怎么表示负数,一个比较好的办法就是将字节的最高位表示为符号位,其余7位表示数值,表示范围为-128~127, 00000000~01111111表示0~127, 10000001~11111111表示-1~-127吗,错!,实际上是10000000~11111111分别对应表示-128~-1,怎么会是这样呢,是不是搞错了,没错的,这就是补码,负数在计算中是以补码来表示的。
那么补码是怎么得到的呢?为了说明这个问题,让我们来先了解一下什么是原码和反码的概念。
原码:数值有正负之分,计算机就用一个数的最高位存放符号(0为正,1为负).这就是机器数的原码了,原码表示范围为-127 ~ -0, +0 ~ +127,除了最高位表示符号位,正负数在其余各位的表示是相同的,例如10000001表示 -1, 11111111表示-127。原码表示虽然很简单,但人们很快就发现用原码来进行加减运算会出问题:假设字长为8bits [2]
( 1 ) 10- ( 1 )10 = ( 1 )10 + ( -1 )10 = ( 0 )10
(00000001)原 + (10000001)原 = (10000010)原 = ( -2 ) 显然不正确
因为两个整数的相加没有问题,所以问题出在带符号位的负数上,人们将负数除符号位的其它位逐位取反,就得到了反码。
 ( 1 )10 - ( 2)10 = ( 1 )10 + ( -2 )10 = ( -1 )10
(00000001) 反+ (11111101)反 = (11111110)反 = ( -1 ) 正确
发现反码表示后,将加减数都表示成反码后,减法可以直接表示成加法,其结果似乎是正确的。但是:
( 1 )10 - ( 1 ) 10= ( 1 ) 10+ ( -1 ) 10= ( 0 )10
 (00000001) 反+ (11111110)反 = (11111111)反 = ( -0 ) 有问题.
问题出现在(+0)和(-0)上,在人们的计算概念中零是没有正负之分的,于是就出现了补码,正数的补码不变,负数的补码是将其反码加1,这样表示后再看看上面的运算:
( 1 ) 10- ( 1 ) 10= ( 1 )10 + ( -1 )10 = ( 0 )10
(00000001)补 + (11111111)补 = (00000000)补 = ( 0 ) 正确
( 1 ) 10- ( 2) 10= ( 1 )10 + ( -2 )10 = ( -1 )10
(00000001) 补+ (11111110) 补= (11111111)补 = ( -1 ) 正确
from http://blog.csdn.net/ylqmf/archive/2009/12/19/5031769.aspx

© 著作权归作者所有

来来叔叔
粉丝 0
博文 100
码字总数 55732
作品 0
广州
高级程序员
私信 提问
java 类型转换的原理

最近在看JDK的源码,在看源码的时候看到了0xff这么个东东,从这里引出了类型转换。因此在此记录下。 在写原理之前先看几个例子。byte b=-1;int a=b;然后打印a得出的结果是-1.int b=-1;byte ...

小宋
2016/04/04
323
0
为什么int类型的最大值是2^31-1 ?

为什么int类型的最大值是2^31-1 ? int类型是8个字节,32位,最大值用二进制表示就是, 0111...(总共31个1)。为什么第一位是0? 二进制里,最高位(第一位)表示符号 0表示正,1表示负。 所以将...

jackzlz
2014/08/26
999
0
总结数值的原码、反码、补码

数值在计算机上计算是以二进制数计算的。 而数值有原码、反码、补码。 而计算机进行计算的时候会以补码的形式计算。 这是为什么呢? 看过一遍博客,说到计算机是没有减法运算的,只有加法运算...

我是xl
2017/07/11
0
0
关于计算机中的《补码》,公式:-n=~n+1 引伸:~n=-n-1

在计算机系统中,数值一律用补码来表示(存储)。主要原因是使用补码可以将符号位和其他位统一处理;同时,减法也可以按加法来处理。另外,两个用补码表示的数相加时,如果最高位(符号位)有...

闻术苑
2012/09/23
110
0
求解,一个很深的问题,有关于补码和反码的!!!!!

当初为什么要发明反码?又为什么发明补码?反码和补码谁更早出现?为什么反码是将原码除符号位全部相反?为什么补码是反码加1?为什么有符号的一个字节区间用1000 0000也就是负0来表示负128...

四川扎克伯格
2013/12/14
249
6

没有更多内容

加载失败,请刷新页面

加载更多

rime设置为默认简体

转载 https://github.com/ModerRAS/ModerRAS.github.io/blob/master/_posts/2018-11-07-rime%E8%AE%BE%E7%BD%AE%E4%B8%BA%E9%BB%98%E8%AE%A4%E7%AE%80%E4%BD%93.md 写在开始 我的Arch Linux上......

zhenruyan
今天
5
0
简述TCP的流量控制与拥塞控制

1. TCP流量控制 流量控制就是让发送方的发送速率不要太快,要让接收方来的及接收。 原理是通过确认报文中窗口字段来控制发送方的发送速率,发送方的发送窗口大小不能超过接收方给出窗口大小。...

鏡花水月
今天
10
0
OSChina 周日乱弹 —— 别问,问就是没空

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @tom_tdhzz :#今日歌曲推荐# 分享容祖儿/彭羚的单曲《心淡》: 《心淡》- 容祖儿/彭羚 手机党少年们想听歌,请使劲儿戳(这里) @wqp0010 :周...

小小编辑
今天
1K
11
golang微服务框架go-micro 入门笔记2.1 micro工具之micro api

micro api micro 功能非常强大,本文将详细阐述micro api 命令行的功能 重要的事情说3次 本文全部代码https://idea.techidea8.com/open/idea.shtml?id=6 本文全部代码https://idea.techidea8....

非正式解决方案
今天
5
0
Spring Context 你真的懂了吗

今天介绍一下大家常见的一个单词 context 应该怎么去理解,正确的理解它有助于我们学习 spring 以及计算机系统中的其他知识。 1. context 是什么 我们经常在编程中见到 context 这个单词,当...

Java知其所以然
昨天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部