二进制的原码、反码、补码、移码

之前了解一些原码、反码、补码,但是一直有疑问,为什么会有原码、反码、补码?所以决定研究一下。

计算机中参与运算的数有两大类:无符号数和有符号数。此篇主要看一下有符号数。在了解原码、反码、补码前需要先了解机器数和真值。

一、机器数

对于有符号数而言,使用“0”表示正,“1”表示负,这种把符号“数字化”的数称为机器数,也就是一个数在计算机中的二进制表示。

例如:+1100 在机器中表示为 0 1100;-1100 在机器中表示为1 1100

整数的符号位和值用逗号隔开,小数的小数点用点来隔开。
例如:+3转换成二进制就是00000011,-3就是10000011,这就是机器数。

二、真值

带符号位的机器数对应的真正数值就是真值。例如:1000 0011的真值是-3,而不是131,它的最高位是符号位。


下面开始说原码、反码、补码。

计算机里存储的实际都是数的补码,显示的时候转换为源码。原码和反码都有一定的缺陷。原码虽然表示简单明了,并易于和真值转换,但是在加减法运算时会有很多麻烦,运算步骤复杂费时,还需要计算机提供减法器来支持。而补码却能够满足这些要求,计算机只需要加法器就可以。

三、原码

原码是机器数中最简单的一种表示形式,包括符号位和数值位。

原码:符号位加上真值的绝对值,即第一位表示符号位,其余为表示值。原码是人脑最容易理解和计算的表示方式。

[+1]原 = 0000 0001
[-1]原 = 1000 0001

整数原码的定义:


式中,x为真值,n为整数的位数(位数不包括符号位,下同)。
例如:
当x=1110时,[x]原=0,1110;
当x=-1110时,[x]=24-(-1110)=1 1110,2 的4次方就相当于是符号位。

计算过程解释:
对于x的取值范围(例中的4位二进制来说):
2^n的值为:2^4=16
最大值为:1111 = 1*2^3 + 1*2^2 + 1*2^1 + 1*2^0 =8+4+2+1=15
最小值为:0000=0

当x为负数时,计算过程如下:
[x]原=2^4 - (-1110) = 2^4 + 1110 = 1 0000 + 1110 = 1 1110

小数原码的定义为:


式中,x为真值。
例如:
当x=0.1101时,[x]=0.1101;
当x=-0.1101时,[x]=1-(-0.1101)=1.1101;

原码的问题:
以正负1来说明问题,先来看1+(-1)的计算过程:

1 + (-1)=[0000 0001]原+[1000 0001]原=[1000 0010]原=-2

1+(-1)=0,但是用原码来算结果却是-2,原码的加法没有问题,但是减法却出现了问题。

四、补码

为了解决原码做减法时出现的问题,出现了反码,我们用其他的方式来表示负数,使减法的问题用加法去解决。

补数的思想:
要了解补码的思想就要知道“模”、“同余”、“补数”的概念。

在日常生活中,常会遇到“补数”的概念。计算机组成原理(唐朔飞)中举了一个时钟的例子,现在是6点钟,要到达3点钟的话该怎么办呢?我们可以顺时针方向将时针移动9小时,或是逆时针移动3小时,我们都可以到达3点钟,假设顺时针转为正,逆时针转为负,则有:

6 - 3 = 6 + 9,3和15都代表3点钟

钟表时针转一圈能代表12个小时,在数学上称12为模,写作mod 12,对于mod 12而言,+9和-3互为补数,3和15是同余关系,记作3≡15 (mod 12),3 + 12 = 15.

其实就相当于没到12点就丢失,从0点重新开始。

对于时钟运算,减去一个数,是可以等同于加上另外一个正数,例如:6 - 3 = 6 - 3 + 12 = 6 + 9
其实相当于6-3加上模,即相当于是时钟多走了一圈,所以3和15是等价的。

将补数的概念用到计算机中,便出现了补码这种机器数。

补码:正数的反码是其本身,负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1. (即在反码的基础上+1),这里只是便于计算才这样说。

对于补码,相当于是模加上真值,就如同上面的6+(-3),-3就是真值。
整数补码的定义为:


式中,x为真值,n为整数的位数(对于8位二进制数,那么这里的n就为7,第一位是符号位)。

整数补码定义中mod 2n+1的由来:
以8位二进制为例,整数的位数是n=7,8位二进制可以表示的最小值是:0000 0000,最大值是:1111 1111,从0到255,即可以表示28=256个数字,所以整数补码的模是2n+1,即mod 2n+1

原码中的-0在补码中是什么?
对于-0,根据补码的定义,[-0]=100000-10000=10000,其实在补码中-0是不存在的,这也是补码出现的原因之一,这里的10000只是一种表示方式,所以补码比原码能多表示一个数,这个数就是-2n

例如:
当x=+1010时,[x]=0,1010;
当x=-1101时,[x]=2n+1 + x = 25 - 1101 = 100000 - 1101 = 1,0011

负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1,计算方式的由来:
分析:假如x=-1011,[x]=25-1011,我们把25改写成100000=11111+00001,可以得到:

[x] = 25 + x = 11111 + x + 00001

因为x是负数,我们可以用-x1x2x3x4来表示,单项的xi不是0就是1,上面式子可以改写为:

[x] = 25 + x = 11111 - x1x2x3x4 + 00001

因为1减去1得0,减去0得1,负数-x1x2x3x4的原码为1,x1x2x3x4,所以式子中11111 - x1x2x3x4就相当于是对原码的取反操作,最后再+00001,所以得到上面负数求补码的计算方式。

小数补码的定义为:


式中,x为真值,n为小数的位数。

小数补码定义中mod 2的由来:

小数的最大值为:1.1111,当增加1时(1.1111+1),得到小数补码的模是2,所以小数补码是:mod 2。

例如:
当x=+0.0110时,[x]=0.1001;
当x=-0.0110时,[x]=2 + x = 10.0000 - 0.0110 = 1.1010
当x=0时,
[+0.0000]=0.0000;
[-0.0000]=2 + (-0.0000) = 10.0000 - 0.0000 = 0.0000;
显然[+0]=[-0]=0.0000,即补码中的“零”只有一种表示形式。

补码的符号位扩展:
1、补码的正负小数符号位扩展就是在末尾加0即可,例如:1.1101扩展为1.1101 0000
2、补码的正数符号位扩展在最高位前面加0即可,例如:0101扩展为0000 0101
3、补码的负数符号位扩展在最高位前面加1既可以,例如:1010扩展为1111 1010

五、反码

反码通常用来作为由原码求补码或者由补码求原码的中间过渡。
反码:正数的反码是其本身,负数的反码是在其原码的基础上,符号位不变,其余各个位取反。这个方法只是利于计算,但是并不代表反码的真正含义,可以把它忘记

[+1] = [00000001]原 = [00000001]反
[-1] = [10000001]原 = [11111110]反

整数反码的定义为:


式中,x为真值,n为整数的位数。
例如:
当x=+1101时,[x]=0,1101(用逗号将符号位和数值部分隔开)
当x=-1101时,[x]=(x4+1 - 1)+x=1,1111-1101=1,0010

小数反码的定义为:


式中,x为真值,n为小数的位数。
例如:
当x=+0.0110时,[x]=0.0110;
当x=-0.0110时,[x]=(2-2-4)+x=1.1111-0.0110=1.1001;
当=0时,
[+0.0000]=0.0000;
[-0.0000]=(10.0000-0.0001)-0.0000=1.1111;
由上可见[+0]和[-0]是有两种表现方式。

反码的问题:
反码中0有两种表示方式,0000 0000和1111 1111,这导致在实际计算中每当跨过0一次,就有一个单位的误差,所以需要+1,即补码的方式。

六、移码

因为补码符号位和数值一起编码,所以很难从补码上直接判断出其真值的大小,而用移码就可以很直观的看判断出来。

移码的定义:


式中,x为真值,n为整数的位数。
例如:
当x=10100时,[x]=25+10100=1,10100
当x=-10100时,[x]=25-10100=0,01100
可以直接看出10100>-10100

利用移码的这一特点,当浮点数的阶码用移码表示时,就能很方便的判断阶码的大小。

移码相当于补码的符号位取反。

对于补码来说是存在符号位的,使用移码就相当于把补码的负数部分往上移动,使得最小值变为0,而不是负数。

移码更详细的用处以后再研究。


写在最后:

  • 如果文章中有错误或是表达不准确的地方,欢迎大家评论中指正,以便我完善。
  • 文章我也会根据所学到新的知识不断更新。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,874评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,102评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,676评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,911评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,937评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,935评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,860评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,660评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,113评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,363评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,506评论 1 346
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,238评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,861评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,486评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,674评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,513评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,426评论 2 352