原码、反码、补码课件
- 格式:pdf
- 大小:418.94 KB
- 文档页数:28
计算机原理- 整数的补码,原码, 反码解释一:对于整数来讲其二进制表示没有符号位.一个字节的表示范围为00000000-11111111,由此可见一个字节的整数表示范围为[0,255=2^8 - 1]。
对于整数来讲,其二进制表示中存在一个符号位.先来看一下下面几个定义:1:在计算机中,负数以其正值的补码形式表达。
正数即在符号位补0.2:原码:一个整数,按照绝对值大小转换成的二进制数,称为原码。
3:反码:将二进制数按位取反,所得的新二进制数称为原二进制数的反码。
4:补码: 反码+1由以上可以得到.计算机储存有符号的整数时,是用该整数的补码进行储存的,0的原码、补码都是0;正数的原码、补码可以特殊理解为相同;负数的补码是它的反码加1。
范围: 正数[00000000 - 01111111] 即[0, 2^7 - 1]。
负数[10000000 - 11111111] 。
范围说明. 11111111 - 1 = 11111110,取反=00000001 即是-1. 10000000 -1 = 01111111,取反=10000000, 即是-128. 因此有一个有符号二进制表示范围是从[-128-127].解释二:大家都知道数据在计算机中都是按字节来储存了,1个字节等于8位(1Byte=8bit),而计算机只能识别0和1这两个数,所以根据排列,1个字节能代表256种不同的信息,即2^8(0和1两种可能,8位排列),比如定义一个字节大小的无符号整数(unsigned char),那么它能表示的是0~255(0~2^8 -1)这些数,一共是256个数,因为,前面说了,一个字节只能表示256种不同的信息。
别停下,还是一个字节的无符号整数,我们来进一步剖析它,0是这些数中最小的一个,我们先假设它在计算机内部就用8位二进制表示为00000000(从理论上来说也可以表示成其他不同的二进制码,只要这256个数每个数对应的二进制码都不相同就可以了),再假设1表示为00000001,2表示为00000010,3表示为00000011,依次类推,那么最大的那个数255在8位二进制中就表示为最大的数11111111,然后,我们把这些二进制码换算成十进制看看,会发现刚好和我们假设的数是相同的,而事实上,在计算机中,无符号的整数就是按这个原理来储存的,所以告诉你一个无符号的整数的二进制码,你就可以知道这个数是多少,而且知道在计算机中,这个数本身就是以这个二进制码来储存的。
原码、反码、补码⼀、什么是原码、反码、补码原码:将⼀个整数,转换成⼆进制,就是其原码。
如单字节的5的原码为:0000 0101;-5的原码为1000 0101。
反码:正数的反码就是其原码;负数的反码是将原码中,除符号位以外,每⼀位取反。
如单字节的5的反码为:0000 0101;-5的反码为1111 1010。
补码:正数的补码就是其原码;负数的反码+1就是补码。
如单字节的5的补码为:0000 0101;-5的补码为1111 1011。
⼆、为什么要有这三类码计算机只能识别0和1,使⽤的是⼆进制。
⽽在⽇常⽣活中⼈们使⽤的是⼗进制,并且我们⽤的数值有正负之分。
于是在计算机中就⽤⼀个数的最⾼位存放符号(0为正,1为负)。
这就是机器数的原码了。
有了数值的表⽰⽅法就可以对数进⾏算术运算,但是很快就发现⽤带符号位的原码进⾏乘除运算时结果正确,⽽在加减运算的时候就出现了问题,如下:假设字长为8bits(1) 10 - (1)10 = (1)10 + (-1)10 = (0)10(0 0000001)原 + (1 0000001)原 = (1 0000010)原 = ( -2 ) 显然不正确。
因为在两个整数的加法运算中是没有问题的,于是就发现问题出现在带符号位的负数⾝上。
对除符号位外的其余各位逐位取反就产⽣了反码。
反码的取值空间和原码相同且⼀⼀对应。
下⾯是反码的减法运算:(1)10 - (1)10 = (1)10 + (-1)10= (0)10(0 0000001)反 + (1 1111110)反 = (1 1111111)反 = ( -0 ) 有问题。
(1)10 - (2)10 = (1)10 + (-2)10 = (-1)10(0 0000001)反 + (1 1111101)反 = (11111110)反 = (-1) 正确。
问题出现在(+0)和(-0)上,在⼈们的计算概念中零是没有正负之分的。
(印度⼈⾸先将零作为标记并放⼊运算之中,包含有零号的印度数学和⼗进制计数对⼈类⽂明的贡献极⼤)。
原码,反码,补码数在计算机中是以二进制形式表示的。
数分为有符号数和无符号数。
原码、反码、补码都是有符号定点数的表示方法。
一个有符号定点数的最高位为符号位,0是正,1是副。
以下都以8位整数为例,原码就是这个数本身的二进制形式。
例如0000001 就是+11000001 就是-1正数的反码和补码都是和原码相同。
负数在计算机中,负数以其正值的补码形式表达。
什么叫补码呢?这得从原码,反码说起。
原码:一个整数,按照绝对值大小转换成的二进制数,称为原码。
比如00000000 00000000 00000000 00000101 是5的原码。
反码:将二进制数按位取反,所得的新二进制数称为原二进制数的反码。
取反操作指:原为1,得0;原为0,得1。
(1变0; 0变1)比如:将00000000 00000000 00000000 00000101每一位取反,得11111111 11111111 11111111 11111010。
称:11111111 11111111 11111111 11111010 是00000000 00000000 00000000 00000101 的反码。
反码是相互的,所以也可称:11111111 11111111 11111111 11111010 和00000000 00000000 00000000 00000101 互为反码的反码是将其原码除符号位之外的各位求反[-3]反=[10000011]反=11111100负数的补码是将其原码除符号位之外的各位求反之后在末位再加1。
[-3]补=[10000011]补=11111101一个数和它的补码是可逆的。
为什么要设立补码呢?第一是为了能让计算机执行减法:[a-b]补=a补+(-b)补第二个原因是为了统一正0和负0正零:00000000负零:10000000这两个数其实都是0,但他们的原码却有不同的表示。
但是他们的补码是一样的,都是00000000特别注意,如果+1之后有进位的,要一直往前进位,包括符号位!(这和反码是不同的!)[10000000]补=[10000000]反+1=11111111+1=(1)00000000=00000000(最高位溢出了,符号位变成了0)有人会问10000000这个补码表示的哪个数的补码呢?其实这是一个规定,这个数表示的是-128所以n位补码能表示的范围是-2^(n-1)到2^(n-1)-1比n位原码能表示的数多一个又例:1011原码:01011反码:01011 //正数时,反码=原码补码:01011 //正数时,补码=原码-1011原码:11011反码:10100 //负数时,反码为原码取反补码:10101 //负数时,补码为原码取反+10.1101原码:0.1101反码:0.1101 //正数时,反码=原码补码:0.1101 //正数时,补码=原码-0.1101原码:1.1101反码:1.0010 //负数时,反码为原码取反补码:1.0011 //负数时,补码为原码取反+1总结:在计算机内,定点数有3种表示法:原码、反码和补码所谓原码就是前面所介绍的二进制定点表示法,即最高位为符号位,“0”表示正,“1”表示负,其余位表示数值的大小。
2.1 原码、反码与补码在计算机内的数(称之为“机器数”)值有3种表示法:原码、反码和补码。
所谓原码就是带正、负号的二进制数,即最高位为符号位,“0”表示正,“1”表示负,其余位表示数值的大小。
反码表示法规定:正数的反码与其原码相同;负数的反码是对其原码逐位取反,但符号位除外。
补码表示法规定:正数的补码与其原码相同;负数的补码是在其反码的末位加1。
由此可见,这三种表示法中,关键是负数的表示方式不一样。
2.2.1 正负数表示、定点数与浮点数在计算机内,通常把1个二进制数的最高位定义为符号位,用“0”表示正数,“1”表示负数;其余位表示数值。
规定小数点位置固定不变的数称为“定点数”;小数点的位置不固定,可以浮动的数称为“浮点数”。
2.2.2 原码原码表示法是定点数的一种简单的表示法。
用原码表示带符号二进制数时,符号位用0表示正,1表示负;数值位保持不变。
原码表示法又称为符号-数值表示法。
1. 小数原码表示法设有一数为x,则原码表示可记作[x]原(下标表示)。
例如,X1= +1010110 ;X2= -1001010原码表示数的范围与二进制位数有关。
设二进制小数X=±0.X1X2…Xm,则小数原码的定义如下:例如:X=+0.1011时,根据以上公式可得[X]原=0.1011;X=-0.1011时,根据以上公式可得[X]原= 1-(-0.1011)=1.1011=1.1011当用8位二进制来表示小数原码时,其表示范围为:最大值为0.1111111,其真值约为(0.99)10 ;最小值为1.1111111,其真值约为(-0.99)10。
根据定义,小数“0”的原码可以表示成0.0…0或1.0…0。
2. 整数原码表示法整数原码的定义如下:例如:X=+1101时,根据以上公式可得[X]原=01101;X=-1101时,根据以上公式可得[X]原=24-(-1101)=10000+1101=11101当用8位二进制来表示整数原码时,其表示范围为:最大值为01111111,其真值为(127)10 ;最小值为11111111,其真值为(-127)10 。
原码,反码,补码及运算一、定义1.原码正数的符号位为0,负数的符号位为1,其它位按照一般的方法来表示数的绝对值。
用这样的表示方法得到的就是数的原码。
【基准2.13】当机器字长为8十一位二进制数时:x=+1011011[x]原码=01011011y=+1011011[y]原码=11011011[+1]原码=00000001[-1]原码=10000001[+127]原码=01111111[-127]原码=11111111原码则表示的整数范围就是:-(2n-1-1)~+(2n-1-1),其中n为机器字长。
则:8十一位二进制原码则表示的整数范围就是-127~+12716十一位二进制原码则表示的整数范围就是-32767~+327672.反码对于一个带符号的数来说,正数的反码与其原码相同,负数的反码为其原码除符号位以外的各位按位取反。
【基准2.14】当机器字长为8十一位二进制数时:x=+1011011[x]原码=01011011[x]反码=01011011y=-1011011[y]原码=11011011[y]反码=10100100[+1]反码=00000001[-1]反码=11111110[+127]反码=01111111[-127]反码=10000000负数的反码与负数的原码存有非常大的区别,反码通常用做谋补码过程中的中间形式。
反码则表示的整数范围与原码相同。
3.补码正数的补码与其原码相同,负数的补码为其反码在最低位加1。
导入补码以后,计算机中的以此类推运算都可以统一化成补码的乘法运算,其符号位也参予运算。
【例2.15】(1)x=+1011011(2)y=-1011011(1)根据定义存有:[x]原码=01011011[x]补码=01011011(2)根据定义存有:[y]原码=11011011[y]反码=10100100[y]补码=10100101补码表示的整数范围是-2n-1~+(2n-1-1),其中n为机器字长。
原码,补码和反码⼀. 机器数和真值在学习原码, 反码和补码之前, 需要先了解机器数和真值的概念.1、机器数⼀个数在计算机中的⼆进制表⽰形式, 叫做这个数的机器数。
机器数是带符号的,在计算机⽤⼀个数的最⾼位存放符号, 正数为0, 负数为1.⽐如,⼗进制中的数 +3 ,计算机字长为8位,转换成⼆进制就是00000011。
如果是 -3 ,就是 10000011 。
那么,这⾥的 00000011 和 10000011 就是机器数。
2、真值因为第⼀位是符号位,所以机器数的形式值就不等于真正的数值。
例如上⾯的有符号数 10000011,其最⾼位1代表负,其真正数值是 -3 ⽽不是形式值131(10000011转换成⼗进制等于131)。
所以,为区别起见,将带符号位的机器数对应的真正数值称为机器数的真值。
例:0000 0001的真值 = +000 0001 = +1,1000 0001的真值= –000 0001 = –1⼆. 原码, 反码, 补码的基础概念和计算⽅法.在探求为何机器要使⽤补码之前, 让我们先了解原码, 反码和补码的概念.对于⼀个数, 计算机要使⽤⼀定的编码⽅式进⾏存储. 原码, 反码, 补码是机器存储⼀个具体数字的编码⽅式.1. 原码原码就是符号位加上真值的绝对值, 即⽤第⼀位表⽰符号, 其余位表⽰值. ⽐如如果是8位⼆进制:[+1]原 = 00000001[-1]原 = 10000001第⼀位是符号位. 因为第⼀位是符号位, 所以8位⼆进制数的取值范围就是:[11111111 , 01111111]==>[-127 , 127]2. 反码反码的表⽰⽅法是:正数的反码是其本⾝负数的反码是在其原码的基础上, 符号位不变,其余各个位取反.[+1] = [00000001]原 = [00000001]反[-1] = [10000001]原 = [11111110]反3. 补码补码的表⽰⽅法是:正数的补码就是其本⾝负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1. (即在反码的基础上+1)[+1] = [00000001]原 = [00000001]反 = [00000001]补[-1] = [10000001]原 = [11111110]反 = [11111111]补三. 为何要使⽤原码, 反码和补码计算机可以有三种编码⽅式表⽰⼀个数. 对于正数因为三种编码⽅式的结果都相同:[+1] = [00000001]原 = [00000001]反 = [00000001]补所以不需要过多解释. 但是对于负数:[-1] = [10000001]原 = [11111110]反 = [11111111]补可见原码, 反码和补码是完全不同的. 为何还会有反码和补码呢?⾸先, 因为⼈脑可以知道第⼀位是符号位, 在计算的时候我们会根据符号位, 选择对真值区域的加减. (真值的概念在本⽂最开头).但是对于计算机, 加减乘数已经是最基础的运算, 要设计的尽量简单. 计算机辨别"符号位"显然会让计算机的基础电路设计变得⼗分复杂! 于是⼈们想出了将符号位也参与运算的⽅法.根据运算法则减去⼀个正数等于加上⼀个负数, 即: 1-1 = 1 + (-1) = 0 , 所以机器可以只有加法⽽没有减法, 这样计算机运算的设计就更简单了.于是⼈们开始探索将符号位参与运算, 并且只保留加法的⽅法. ⾸先来看原码:计算⼗进制的表达式: 1-1=0为了解决原码做减法的问题, 出现了反码:1 - 1 = 1 + (-1) = [0000 0001]原 + [1000 0001]原= [0000 0001]反 + [1111 1110]反 = [1111 1111]反 = [1000 0000]原 = -0发现⽤反码计算减法, 结果的真值部分是正确的. ⽽唯⼀的问题其实就出现在"0"这个特殊的数值上. 虽然⼈们理解上+0和-0是⼀样的, 但是0带符号是没有任何意义的. ⽽且会有[0000 0000]原和[1000 0000]原两个编码表⽰0.于是补码的出现, 解决了0的符号以及两个编码的问题:1-1 = 1 + (-1) = [0000 0001]原 + [1000 0001]原 = [0000 0001]补 + [1111 1111]补 = [0000 0000]补=[0000 0000]原这样0⽤[0000 0000]表⽰, ⽽以前出现问题的-0则不存在了.⽽且可以⽤[1000 0000]表⽰-128:(-1) + (-127) = [1000 0001]原 + [1111 1111]原 = [1111 1111]补 + [1000 0001]补 = [1000 0000]补-1-127的结果应该是-128, 在⽤补码运算的结果中, [1000 0000]补就是-128. 但是注意因为实际上是使⽤以前的-0的补码来表⽰-128, 所以-128并没有原码和反码表⽰.(对-128的补码表⽰[1000 0000]补算出来的原码是[0000 0000]原, 这是不正确的)使⽤补码, 不仅仅修复了0的符号以及存在两个编码的问题, ⽽且还能够多表⽰⼀个最低数. 这就是为什么8位⼆进制, 使⽤原码或反码表⽰的范围为[-127, +127], ⽽使⽤补码表⽰的范围为[-128, 127].因为机器使⽤补码, 所以对于编程中常⽤到的32位int类型, 可以表⽰范围是: [-231, 231-1] 因为第⼀位表⽰的是符号位.⽽使⽤补码表⽰时⼜可以多保存⼀个最⼩值.四原码, 反码, 补码再深⼊计算机巧妙地把符号位参与运算, 并且将减法变成了加法, 背后蕴含了怎样的数学原理呢?将钟表想象成是⼀个1位的12进制数. 如果当前时间是6点, 我希望将时间设置成4点, 需要怎么做呢?我们可以:1. 往回拨2个⼩时: 6 - 2 = 42. 往前拨10个⼩时: (6 + 10) mod 12 = 43. 往前拨10+12=22个⼩时: (6+22) mod 12 =42,3⽅法中的mod是指取模操作, 16 mod 12 =4 即⽤16除以12后的余数是4.所以钟表往回拨(减法)的结果可以⽤往前拨(加法)替代!现在的焦点就落在了如何⽤⼀个正数, 来替代⼀个负数. 上⾯的例⼦我们能感觉出来⼀些端倪, 发现⼀些规律. 但是数学是严谨的. 不能靠感觉.⾸先介绍⼀个数学中相关的概念: 同余同余的概念两个整数a,b,若它们除以整数m所得的余数相等,则称a,b对于模m同余记作 a ≡ b (mod m)读作 a 与 b 关于模 m 同余。
原码、反码、补码、移码、阶码、BCD码、余3码原码:原码(true form)是一种计算机中对数字的二进制定点表示方法。
源码表示法在数值前面增加了一位符号位(即最高位为符号位),该位为0表示正数,该位为1表示负数。
反码:反码表示法规定:正数的反码于原码相同;负数的反码是其原码除符号位外逐位取反。
补码:补码(two’s complement) 1、在计算机中,数值一律用补码表示(存储)。
主要原因:使用补码,可以将符号位和其它位统一处理;同时,减法也可按加法处理。
另外,两个用补码表示的数相加时,如果最高位(符号位)有进位,则进位被舍弃。
2、补码与原码的转换过程几乎是相同的。
==补码的概述==求给定数值的补码表示分以下两种情况:(1)正数的补码:与原码相同。
【例1】+9的补码是00001001。
(这个+9的补码说的是用8位的2进制来表示补码的,补码表示表示方式很多,还有16位2进制补码表示形式,以及32位2进制补码表示形式等。
)(2)负数的补码:符号位为1,其余位为该数绝对值的原码按位取反;然后加1。
同一数字在不同的补码表示形式里头是不同的。
【例2】求-7的补码。
因为给定数是负数,则符号位为“1”。
后七位:+7的原码(0000111)→按位取反(1111000)→加1(1111001),所以-7的补码为1111001。
已知一个数的补码,求原码的操作分两种情况:(1)如果补码的符号位为“0”,表示是一个正数,其原码就是补码。
(2)如果补码的符号位为“1”,表示是一个负数,那么求给定的这个补码的补码就是要求的原码。
另一种方法求负数的补码,如下:例如:求-15的补码第一步:+15:00001111第二步:逐位取反,然后在末位加1。
11110001【例3】已知一个补码11111001则原码是10000111(-7)。
(补码的补码)“模”的概念“模”是指一个计量系统的计数范围。
如时钟等。
计算机也可以看成一个计量机器,它也有一个计量范围,即都存在一个“模”。
计算机基础理论:原码、反码、补码、移码计算机基础理论:原码、反码、补码、移码(2009-04-23 00:02:36)一、标准理论1、原码的定义①小数原码的定义[X]原=X 0≤X <1 1- X -1 <X ≤ 0例如: X=+0.1011 , [X]原= 01011 X=-0.1011 [X]原= 11011②整数原码的定义[X]原=X 0≤X <2n 2n-X - 2n <X ≤ 02、补码的定义①小数补码的定义[X]补=X 0≤X <1 2+ X-1 ≤ X <例如: X=+0.1011, [X]补= 01011 X=-0.1011, [X]补= 10101②整数补码的定义[X]补=X 0≤X <2n 2n+1+X- 2n≤ X< 03、反码的定义①小数反码的定义[X]反=X 0≤X <1 2-2n-1-X-1 <X ≤例如: X=+0.1011 [X]反= 01011X=-0.1011 [X]反= 10100 ②整数反码的定义[X]反=X 0≤X <2n 2n+1-1-X- 2n< X≤ 04.移码:移码只用于表示浮点数的阶码,所以只用于整数。
①移码的定义:设由1位符号位和n位数值位组成的阶码,则 [X]移=2n + X -2n≤X ≤ 2n例如: X=+1011 [X]移=11011 符号位“1”表示正号X=-1011 [X]移=00101 符号位“0”表示负号②移码与补码的关系: [X]移与[X]补的关系是符号位互为反码,例如: X=+1011 [X]移=11011 [X]补=01011X=-1011 [X]移=00101 [X]补=10101③移码运算应注意的问题:◎对移码运算的结果需要加以修正,修正量为2n,即对结果的符号位取反后才是移码形式的正确结果。
◎移码表示中,0有唯一的编码——1000...00,当出现000 (00)时(表示-2n),属于浮点数下溢。
二、补码加、减运算规则1、运算规则[X+Y]补= [X]补+ [Y]补[X-Y]补= [X]补+ [-Y]补若已知[Y]补,求[-Y]补的方法是:将[Y]补的各位(包括符号位)逐位取反再在最低位加1即可。
原码、补码、反码原码,反码,补码的产生就是为了解决计算机做减法和引入符号位(正号和负号)的问题。
【原码】机器数的最高位表示符号位,‘1’表示负号,‘0’表示正号。
其他位存放该数的二进制的绝对值。
例:(5)10=00000101(-5)10=10000101部分正负数的二进制原码表示法符号位正数:0 负数:1 二进制的绝对值使用二进制进行简单运算:00000001+00000010=00000011(1+2=3)正确00000000+10000000=10000000(+0+(-0)=-0)正确00000001+10000001=10000010(1+(-1)=-2)错误发现:正数加法不会出错,但正数与负数相加,负数与负数相加会引起出错。
【反码】原码的问题:一个数加上他的相反数不等于零。
为此:利用反码(按位取反表示负数)。
[计算规则]正数的反码还是等于原码负数的反码就是他的原码除符号位外,按位取反。
例:+3的反码:00000011(与+3原码相同)-3的反码:11111100(符号位与-3原码相同,剩余按位取反)计算:00000011+11111100=11111111(3+(-3)= - 0)正确11111110(-1)+11111101(-2)=11111011(-4)错误发现:相反数相加=0的问题解决了,但是两个负数相加出错了思路:例如(-4)+(-3),先进行4+3计算,最后结果直接加上负号。
解决办法:将两个负数反码包括符号位全部按位取反相加【将负数补码转换成正数原码】,然后再给他的符号位强行置‘1’【最后结果统一变为负数】。
【补码】[计算规则]正数的补码等于原码负数的补码等于反码+1。
(负数的补码等于他的原码自低位向高位,尾数的第一个‘1’及其右边的‘0’保持不变,左边的各位按位取反,符号位不变。
)。