文档章节

重温计算机二进制补码

何川jad
 何川jad
发布于 2017/07/26 00:18
字数 879
阅读 13
收藏 0

       亚里士多德说:“今天十进制的广泛采用,只不过是我们绝大多数人生来具有10个手指头这个解剖学事实的结果。”然而,数在计算机中确是以二制形式表示的,因为计算机是用数字电路搭成的,数字电路中只有1和0两种状态,也就是说计算机只有两个手指头,所以对计算机来说二进制(Binary)是最自然的计数方式。

       实事上,数在计算机中不仅仅是以二进制形式表示,而且是以二进制的补码形式表示的,何为补码?为什么要用补码?下面从数计算机表示形式说起。
数分为有符号数和无符号数,对于有符号数,它有三种表示形式:原码、反码和补码。在它的二进制原码中,用最高位表示符号位,如果最高位为0,表示该数为正数,最高位为1则表示为负数。比如00000001是1的原码,而10000001则是-1的原码。

       因为人为的把一个数字的原码最高位定义为符号位,而计算机在运算的过程中,如果用原码计算,可能并不能正确的识别,比如假设字长为8bits 要完成,1-1 =0的运算时,计算运算过程如下:

( 1 ) - ( 1 )

= ( 1 ) + ( -1 )

= (00000001)+ (10000001) -------原码计算

= (10000010)= ( -2 )

这结果显然不正确,不正确的原因就是因为-1的高位符号位被当做普通数位参与运算了。

       为了让符号位一起参与计算而不出现错误,引进反码和补码的概念:原于正数而言,它的反码与补码跟原码相同,对于负数而言,它的补码是在原码的基础上保持符号位不变,而其它各位取反得到反码,补码则被定义成它的补码加1即:

正数:

       原码=反码=补码
负数:

       反码=其原码除符号位之外的各位求反

       补码=反码+1  (如果+1之后有进位的,要一直往前进位,包括符号位)

补码有以下几个特性:

1.补码本身具有幂等性:该特性决定我们虽然运算使用补码,但是通过两次补码可以回到原码;
  ((X)补)补=X
   a+b=(a补+b补)补

2.补码解决了正0 0的二义性,使0的表示得到统一
  正零:00000000
  负零:10000000
  这两个数其实都是0,但他们的原码却有不同的表示。
  但是他们的补码是一样的,都是00000000

3.CPU将加,减法统一为加法运算
  [a-b]补=a补+(-b)补

4.使符号位能与有效值部分一起参加运算,从而简化运算规则。

5.补码使二进制的加、减、移位等操作和十进制具有相同的运算规律;

6.负数-a实际上使用0-a结果,通过二进制运算0-a就是-a的补码,由此可见定义补码就是要求所有算术运算符合现有的运算规律

       正因为如此,计算机底层都是采用补码进行计算的。

上文中粗体字体或红色字体的内容为重点了解或者记忆的内容,更多信息,请用微信扫码关注本人公众号

© 著作权归作者所有

共有 人打赏支持
何川jad
粉丝 27
博文 24
码字总数 57010
作品 0
广州
私信 提问
补基础:自学:计算机科学导论 第三章 数据存储

3.1 数据类型 数字 文字 音频 图像 视频 计算机内部的数据 所有计算机外部的数据类型的数据都采用统一的数据表示法转换后存入计算机中,当数据从计算机输出时再还原回来。这种通用的格式称为...

soulpei
06/26
0
0
二进制补码

二进制补码 青蜂侠2017-12-165 阅读 二进制 为便于表达,在这里假定是在8位机器表示 二进制补码表示 无符号十进制整数x的二进制表示是之间将x不断整除2,然后将余数反向排列得到。比如8的二进...

青蜂侠
2017/12/16
0
0
原码 && 反码 && 补码

原码 && 反码 && 补码 一、原码 && 反码 && 补码 原码 原码是一种计算机中对数字的二进制定点表示方法。原码表示法在数值前面增加了一位符号位(即最高位为符号位):正数该位为0,负数该位为...

秋风醉了
2014/07/27
169
0
Java位运算符及二进制常识

一、位运算    二、位移运算    三、二进制数   以Java中最常使用的int类型为例(32位)。    ㈠ 符号位   二进制数最左端的数字为符号位:0代表正,1代表负。 ㈡ 最大与最小   ⑴...

Xcafe
2016/12/29
36
0
关于计算机中的《补码》,公式:-n=~n+1 引伸:~n=-n-1

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

闻术苑
2012/09/23
0
0

没有更多内容

加载失败,请刷新页面

加载更多

SpringBoot中使用@RequestBody时如何自定义需要转换的日期格式

SpringBoot序列化和反序列化Json时默认使用的是Jackson(例如使用@RequestBody反序列化前端传递过来的Json字符串时), 当我们前端使用Json字符串传递到后台时日期格式可能是时间戳(即long类...

帅得拖网速
32分钟前
0
0
可自定义扩展底部列表对话框ListBottomSheetDialogFragment

因为需要,为了方便,构建了一个可以自定义扩展的底部列表对话框,可以应付大部分场景。 效果图如下: 1.默认实现: 2.自定义列表实现 3.自定义头部和列表实现 一.可实现功能 1.默认可实现通...

明月春秋
今天
1
0
数据库---增删改查

增:insert into 表名(列名1,列名2) values(‘列值1’,‘列值2’) 多行数据处理:insert into 表名(列名1,列名2) select ‘列值1’,‘列值2’ union select ‘列值1.1’,‘列值2.2...

森林之下
今天
2
0
分布式/集群下session共享方案汇总

除去那些对容器依赖特别高的方案(如: 基于Tomcat的memcached-session-manager / tomcat-redis-session-manager,基于Jetty的jetty-nosql-memcache / jetty-session-redis ),自己整理了下...

哥本哈根的小哥
今天
2
0
Vue中的缩写:v-bind、v-on

v-bind 缩写:: 预期:any (with argument) | Object (without argument) 参数:attrOrProp (optional) 修饰符: .prop - 被用于绑定 DOM 属性。 .camel - (2.1.0+) 将 kebab-case 特性名转换......

文文1
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部