原码反码补码移码

合集下载

c语言 原码,反码和补码的转换方法

c语言 原码,反码和补码的转换方法

c语言原码,反码和补码的转换方法篇一:在 C 语言中,原码、反码和补码都是用来表示数字的编码方式。

其中,原码是最常见的一种编码方式,它用二进制数的最高位来表示符号 (正码或负码),其余位表示数值。

反码是在原码的基础上将数值位的符号位翻转得到的编码方式,而补码则是在原码的基础上将数值位的符号位再加一位得到的编码方式。

下面是 C 语言中原码、反码和补码的转换方法:1. 原码转换为反码:- 取原码数字的个位数字,如果这个数字为 0 或 1,则直接将其转换为反码;- 如果这个数字为 2 或 3,则将其转换为反码后再加 1;- 其他的位按照原码的二进制位数依次判断符号,如果为负数,则将其转换为反码后再加 1。

例如,将数字 8 转换为反码,步骤如下:- 个位数字为 0,转换为反码后为 0;- 十位数字为 8,转换为反码后为 8;- 百位数字为 0,转换为反码后为 0;- 千位数字为 8,转换为反码后为 8;- 万位数字为 0,转换为反码后为 0;- 亿位数字为 8,转换为反码后为 8 + 1 = 9。

2. 反码转换为原码:- 取反码数字的所有位,包括符号位;- 将反码数字的最高位设置为 1,表示符号位为 1;- 其他的位按照反码的二进制位数依次将数字转换为二进制数,去掉符号位后得到原码。

例如,将数字 9 转换为原码,步骤如下:- 取反码,得到 1010;- 将反码数字的最高位设置为 1,得到 1011;- 将剩余的位按照反码的二进制位数依次转换为二进制数,得到 11001,去掉符号位后得到 8。

3. 补码转换为原码:- 取补码数字的所有位,包括符号位;- 将补码数字的最高位设置为 1,表示符号位为 1;- 其他的位按照补码的二进制位数依次将数字转换为二进制数,去掉符号位后得到原码。

例如,将数字 10 转换为原码,步骤如下:- 取补码,得到 11001;- 将补码数字的最高位设置为 1,得到 1101;- 将剩余的位按照补码的二进制位数依次转换为二进制数,得到 10000,去掉符号位后得到 8。

二进制正负数及0的原码、反码、补码之间的转化(附标志位解释)

二进制正负数及0的原码、反码、补码之间的转化(附标志位解释)

⼆进制正负数及0的原码、反码、补码之间的转化(附标志位解释)1、0的原码反码补码 0原码是00000000 -0原码是10000000 0反码是00000000 -0反码是11111111 0补码是00000000 补码没有正0与负0之分。

⾸先,计算机都是使⽤⼆进制的补码进⾏计算。

2、⼆进制1、正数的⼆进制原码、反码、补码都是相同的2、负数的⼆进制原码:负数的绝对值的⼆进制的最⾼位变为1(1是标志位,只⽤来表⽰正负,1表⽰负数,0表⽰是正数。

所以⼋位⼆进制的取值范围是[-127,127]),其余位与正数原码相同。

⽐如-32第⼀步:32(10)=00100000(2)第⼆步:最⾼位变为1:101000003、负数的反码:等于原码的最⾼位不变,其余取反。

⽐如-32原码为:10100000反码为:110111114、负数的补码:等于原码的最⾼位不变,其余取反,然后加⼀。

⽐如-32第⼀步,原码为:10100000第⼆步,最⾼位不变取反:11011111第三步,加⼀得补码:11100000原码变成反码:最⾼位不变,其余取反原码变成补码:最⾼位不变,其余取反之后加⼀。

补码变成移码:补码最⾼符号位取反就是移码。

3、定点⼩数、定点整数和浮点数的范围(1)16位⽆符号整数范围:0 ~ 216-1,即0~65535(2)16位原码定点⼩数范围: -(1-2-15)~+(1-2-15)(3)16位移码定点整数范围: -215~+(215-1) 即-32768~+32767(4)16位补码定点整数范围: -215~+(215-1) 即-32768~+32767下述格式浮点数范围:关于原点对称的最⼤正数:+0.111 1111*21111 1111=+(1-2-7)*2127最⼩正数:+0.100 0000*20000 0000=+2-1*2-128=+2-129最⼤负数:-0.100 0000*20000 0000= - 2-1*2-128= - 2-129最⼩负数:- 0.111 1111*21111 1111= - (1-2-7)*21274、标志位解释1、(进位标志) =1 算术操作最⾼位产⽣了进位或借位, =0 最⾼位⽆进位或借位( =1 则说明了有进位或借位,CF=0 则说明了⽆借位);2、PF(奇偶标志) =1 数据最低8位中1的个数为偶数,=0 数据最低8位中1的个数为奇数;3、AF(辅助进位标志) =1 D3→D4位产⽣了进位或借位,=0 D3→D4位⽆进位或借位;4、(零标志) =1 操作结果为0,=0 结果不为0;5、(符号标志) =1 结果最⾼位为1 ,=0 结果最⾼位为0;6、(溢出标志) =1 此次运算发⽣了溢出, =0 ⽆溢出。

原码、补码、反码、移码(习题) (1)

原码、补码、反码、移码(习题) (1)

原码、补码、反码、移码一、选择合适的名词解释(20分)1 原码表示2补码表示3 反码表示4 移码表示5 逻辑数A 正数与原码相同,负数符号位为“1”,数值部分求反加1B不带符号的二进制数C用“0”表示正号,用“1”表示负号,有效值部分用二进制的绝对值表示D正数与原码相同,负数符号位为“1”,数值部分求反E在真值X基础上加上一个偏移值,是符号位取反的补码1 (C )2 (A )3 (D )4 (E )5 (B )二、简答题(80分)1机器数字长为8位(含1位符号位),当x=+100(十进制)时:(10分,每问2分)(1)求出其对应的二进制数直接求得:1100100(2)[]x原=0,1100100正数原码反码补码一样(3)[]x反=0,1100100(4)[]x补=0,1100100(5)[]x移=1,1100100移码除了符号位取反,其他的和原码反码补码一样2设机器数字长为8位(含1位符号位),若机器数为80H(十六进制):(10分)(1)当它代表原码时,求出等价的十进制整数(2分)表示原码为1000 0000,即对应的整数为-0(2)当它代表补码时,求出等价的十进制整数(3分)表示成补码为1000 0000,则补码-1得到反码:0111 1111,进而取反得到原码,对应的整数为-128(3)当它代表反码时,求出等价的十进制整数(3分)表示成反码为1000 0000,进而取得原码为0111 1111,即对应的整数为-127(4)当它代表移码时,求出等价的十进制整数(2分)表示成移码为1000 0000,进而取得原码为1000 0000,即对应的整数为-0 3设机器数字长为8位(含1位符号位),求十进制数x=-52的:(10分)(1)[]x原及[]x-原(3分)-52二进制表示为-110100,则[]x原=1,0110100[]x-原=0,0110100(2)[]x反及[]x-反(4分)[]x反=1,1001011 []x-反=0,0110100[]x反除了符号位剩下的都取反,[]x-反除了符号位和原码一样(3)[]x补及[]x-补(4分)[]x补=1,1001100 []x-补=0,0110100[]x-补和反码一样,[]x补在反码的基础上加一4设机器数字长为8位(含1位符号位),求十进制数x=-0.6875的:(10分)(1)[]x原及[]x-原(3分)-0.6875二进制表示为-0.10110 []x原=1.1011000[]x-原=0.1011000符号位取反(2)[]x反及[]x-反(4分)[]x反=1.0100111 []x-反=0.1011000[]x反除了符号位剩下的都取反,[]x-反和原码一样(3)[]x补及[]x-补(4分)[]x补=1.0101000 []x-补=0.1011000[]x-补和反码一样,[]x补在反码的基础上加一5某机字长16位(含1位符号位),求:(10分)(1)它能表示的无符号整数范围(2分)0-65535(2)用原码表示的定点小数范围(3分)-(1-23-15)~(1-2-15)(3)用补码表示的定点小数范围(3分)-1~(1-2-15)(4)用补码表示的定点整数范围(2分)-32 768~32 767(-215~215-1)6某小数定点机,字长8位(含1位符号位),求:(10分)(1)当机器数采用原码时,其对应的真值范围(十进制表示)(3分)-127/128~+127/128(2)当机器数采用补码时,其对应的真值范围(十进制表示)(4分)-1~+127/128(3)当机器数采用反码时,其对应的真值范围(十进制表示)(4分)-127/128~+127/1287请从数据机器编码的表示方法、范围以及运算、应用等当面,对比叙述原码、补码、反码、移码的特点。

计算机基础理论:原码、反码、补码、移码

计算机基础理论:原码、反码、补码、移码

计算机基础理论:原码、反码、补码、移码计算机基础理论:原码、反码、补码、移码(2009-04-23 00:02:36)对于正数,原码和反码,补码都是⼀样的,都是正数本⾝。

对于负数,原码是符号位为1,数值部分取X绝对值的⼆进制。

反码是符号位为1,其它位是原码取反。

补码是符号位为1,其它位是原码取反,未位加1。

也就是说,负数的补码是其反码未位加1。

移码就是将符号位取反的补码⼀、标准理论1、原码的定义①⼩数原码的定义[X]原 =X0≤X <11- X-1 < X ≤ 0例如: X=+0.1011 , [X]原= 01011X=-0.1011 [X]原= 11011②整数原码的定义[X]原 =X0≤X <2n2n-X- 2n < X ≤ 02、补码的定义①⼩数补码的定义[X]补 =X0≤X <12+ X-1 ≤ X < 0例如: X=+0.1011, [X]补= 01011X=-0.1011, [X]补= 10101②整数补码的定义[X]补 =X0≤X <2n2n+1+X- 2n ≤ X < 03、反码的定义①⼩数反码的定义[X]反 =X0≤X <12-2n-1-X-1 < X ≤ 0例如: X=+0.1011 [X]反= 01011X=-0.1011 [X]反= 10100②整数反码的定义[X]反 =X0≤X <2n2n+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,即对结果的符号位取反后才是移码形式的正确结果。

原码、反码、补码

原码、反码、补码

原码、反码、补码⼀、什么是原码、反码、补码原码:将⼀个整数,转换成⼆进制,就是其原码。

如单字节的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)上,在⼈们的计算概念中零是没有正负之分的。

(印度⼈⾸先将零作为标记并放⼊运算之中,包含有零号的印度数学和⼗进制计数对⼈类⽂明的贡献极⼤)。

记忆和转换原码、反码、补码和移码其实很简单!

记忆和转换原码、反码、补码和移码其实很简单!

记忆和转换原码、反码、补码和移码其实很简单!最近在备战软考,复习到计算机组成原理的时候,看到书中关于原码、反码、补码和移码的定义异常复杂。

看完这些定义以后,我的脑袋瞬间膨胀到原来的二倍!这样变态的公式不管你记不记得住,反正我是记不住!还好,以前对它们有所了解,否则看到这一堆公式,恐怕我早就放弃参加软考的念头了。

其实,没必要弄得这么麻烦,它们完全可以用一两句话就描述得很清楚。

原码:如果机器字长为n,那么一个数的原码就是一个n位的二进制数有符号数,其中最高位为符号位:正数为0,负数为1。

剩下的n-1位为数值位,表示真值的绝对值。

凡不足n-1位的,小数在最低位右边加零;整数则在最高位左边加零来补足n-1位。

例如:X = +101011,[X]原= 0010 1011;X = -101011,[X]原= 1010 1011。

注意:正数的原、反、补码都一样。

0的原码跟反码都有两个,因为这里0被分为+0和-0。

反码:知道了原码,那么你只需要具备区分0跟1的能力就可以轻松求出反码。

因为反码就是在原码的基础上,符号位不变,其他位按位取反(就是0变1,1变0)就可以了。

例如:X = -101011,[X]原= 1010 1011,[X]反= 1101 0100。

补码:补码也非常简单,就是在反码的基础上,按照正常的加法运算加1。

例如:X = -101011,[X]原= 1010 1011 ,[X]反= 1101 0100,[X]补= 1101 0101。

也可以在原码的基础上,符号位不变,从右至左遇到第一个1以前(包括这个1)什么都不变,以后按位取反即可。

[X]原= 1000 0110,[X]补= 1111 1010注意:0的补码是唯一的,如果机器字长为8,那么[0]补=0000 0000。

移码:移码最简单了,不管正负数,只要将其补码的符号位取反即可。

例如:X = -101011,[X]原= 1010 1011,[X]反= 1101 0100,[X]补= 1101 0101,[X]移= 0101 0101。

2.1各数原码、反码、补码和移码见下表

2.1各数原码、反码、补码和移码见下表

2.227/64=00011011/01000000=0.0110110=0.11011×2-1规格化浮点表示为:[27/64]原=101,011011000[27/64]反=110,011011000[27/64]补=111,011011000同理:--27/64=--0.11011×2-1规格化浮点表示为:[27/64]原=101,111011000[27/64]反=110,100100111[27/64]补=111,1001010002.3 模为:29=10000000002.4 不对,8421码是十进制的编码2.5浮点数的正负看尾数的符号位是1还是0浮点数能表示的数值范围取决于阶码的大小。

浮点数数值的精确度取决于尾数的长度。

2.61)不一定有N1>N2 2)正确2.7 最大的正数:0111 01111111 十进制数:(1-2-7)×27最小的正数:1001 00000001 十进制数:2-7×2-7最大的负数:1001 11111111 十进制数:--2-7×2-7最小的负数:0111 10000001 十进制数:--(1-2-7)×272.81)[x]补=00.1101 [y]补=11.0010[x+y]补=[x]补+[y]补=11.1111无溢出x+y= -0.0001[x]补=00.1101 [--y]补=00.1110[x-y]补=[x]补+[--y]补=01.1011 正向溢出2)[x]补=11.0101 [y]补=00.1111[x+y]补=[x]补+[y]补=00.0100 无溢出x+y= 0.0100[x]补=11.0101 [--y]补=11.0001[x-y]补=[x]补+[--y]补=10.0110 负向溢出3) [x]补=11.0001 [y]补=11.0100[x+y]补=[x]补+[y]补=10.0101 负向溢出[x]补=11.0001 [--y]补=00.1100[x-y]补=[x]补+[--y]补=11.1101 无溢出X-y=-0.00112.91)原码一位乘法|x|=00.1111 |y|=0.1110部分积乘数y n00.0000 0.1110+00.000000.0000→00.00000 0.111+00.111100.11110→00.011110 0.11+00.111101.011010→00.1011010 0.1+00.111101.1010010→00.11010010P f=x f⊕y f=1 |p|=|x|×|y|=0.11010010所以[x×y]原=1.11010010补码一位乘法[x]补=11.0001 [y]补=0.1110 [--x]补=11.0001 部分积y n y n+100.0000 0.11100→00.00000 0.1110+00.111100.11110→00.011110 0.111→00.0011110 0.11→00.00011110 0.1+11.000111.00101110[x×y]补=11.001011102)原码一位乘法|x|=00.110 |y|=0.010部分积乘数y n00.000 0.010+00.00000.000→00.0000 0.01+00.11000.1100→00.01100 0.0+00.00000.01100 0→00.001100P f=x f⊕y f=0 |p|=|x|×|y|=0.001100所以[x×y]原=0.001100补码一位乘法[x]补=11.010 [y]补=1.110 [--x]补=00.110部分积y n y n+100.000 1.1100→00.0000 1.110+00.11000.1100→00.01100 1.11→00.001100 1.1所以[x×y]补=0.0011002.101)原码两位乘法|x|=000.1011 |y|=00.0001 2|x|=001.0110部分积乘数 c000.0000 00.00010+000.1011000.1011→000.001011 0.000→000.00001011 00.0P f=x f⊕y f=1 |p|=|x|×|y|=0.00001011所以[x×y]原=1.00001011补码两位乘法[x]补=000.1011 [y]补=11.1111 [--x]补=111.0101 部分积乘数y n+1000.0000 11.11110+111.0101111.0101→111.110101 11.111→111.11110101 11.1所以[x×y]补=111.11110101 x×y=--0.000010112)原码两位乘法|x|=000.101 |y|=0.111 2|x|=001.010 [--|x| ]补=111.011 部分积乘数 c000.000 0.1110+111.011111.011→111.11011 0.11+001.010001.00011→000.100011P f=x⊕y f=0 |p|=|x|×|y|=0.100011所以[x×y]原=0.100011补码两位乘法[x]补=111.011 [y]补=1.001 [--x]补=000.101 2[--x]补=001.010 部分积乘数y n+1000.000 1.0010+111.011111.011→111.111011 1.00+001.010001.00011→000.100011所以[x×y]补=0.1000112.111) 原码不恢复余数法|x|=00.1010 |y|=00.1101 [--|y| ]补=11.0011部分积商数00.1010+11.00111101101 0←11.1010+00.110100.0111 0.1←00.1110+11.001100.0001 0.11←00.0010+11.001111.0101 0.110←01.1010+00.110111.0111 0.1100+00.110100.0100所以[x/y]原=0.1100 余数[r]原=0.0100×2—4补码不恢复余数法[x]补=00.1010 [y]补=00.1101 [--y]补=11.0011 部分积商数00.1010+11.001111.1101 0←11.1010+00.110100.0111 0.1←00.1110+11.001100.0001 0.11←00.0010+11.001111.0101 0.110←10.1010+00.110111.0111 0.1100+00.110100.0100所以[x/y]补=0.1100 余数[r]补=0.0100×2—42)原码不恢复余数法|x|=00.101 |y|=00.110 [--|y| ]补=11.010 部分积商数00.101+11.01011.111 0←11.110+00.11000.100 0.1←01.000+11.01000.010 0.11←00.100+11.01011.110 0.110+00.11000. 100所以[x/y]原=1.110 余数[r]原=1.100×2—3补码不恢复余数法[x]补=11.011 [y]补=00.110 [--y]补=11.010 部分积商数11.011+00.11000.001 1←00.010+11.01011.100 1.0←11.000+00.11011.110 1.0011.100+00.11000.010 1.001+11.01011.100所以[x/y]补=1.001+2—3=1.010 余数[r]补=1.100×2—32.121)[x]补=21101×00.100100 [y]补=21110×11.100110小阶向大阶看齐:[x]补=21110×00.010010求和:[x+y]补=21110×(00.010010+11.100110)=21110×11.111000 [x-y]补=21110×(00.010010+00.011010)=21110×00.101100 规格化:[x+y]补=21011×11.000000 浮点表示:1011,11.000000规格化:[x-y]补=21110×00.101100 浮点表示:1110,0.101100 2)[x]补=20101×11.011110 [y]补=20100×00.010110小阶向大阶看齐:[y]补=20101×00.001011求和:[x+y]补=20101×(11.011110+00.001011)=20101×11.101001 [x-y]补=20101×(11.011110+11.110101)=20101×00.010011 规格化:[x+y]补=21010×11.010010 浮点表示:1010,11. 010010规格化:[x-y]补=21010×00.100110 浮点表示:1010,00.1001102.13见教材:P702.141)1.0001011×262)0.110111*×2-62.151)串行进位方式C1=G1+P1C0G1=A1B1,P1=A1⊕B1C2=G2+P2C1G2=A2B2,P2=A2⊕B2C3=G3+P3C2G3=A3B3,P3=A3⊕B3C4=G4+P4C3G4=A4B4,P4=A4⊕B42)并行进位方式C1=G1+P1C0C2=G2+P2G1+P2P1C0C3=G3+P3G2+P3P2G1+P3P2P1C0C4= G4+P4G3+P4P3G2+P4P3P2G1+P4P3P2P1C02.16参考教材P62 32位两重进位方式的ALU和32位三重进位方式的ALU 2.17“1”。

二进制数的四种表示形式

二进制数的四种表示形式

⼆进制数的四种表⽰形式---------以下内容为上⾯博客的学习笔记---------计算机中的⼆进制数有四种主要表⽰形式,那就是原码、反码、补码和移码,其中最重要的是前三种。

1. 原码对于⼈脑来说,我们都知道,+表⽰正数,-表⽰负数,然⽽在计算机⼆进制中也引⼊这两个符号肯定是不⾏的,因为在计算机中只有0和1这两个字,根本不认识“+”和“-”这两个符号。

计算机中的任何⾏为都依赖于它的物理结构。

计算机是没有思维的,所以得让计算机在0和1之间识别出对应数的正与负。

最开始的时候,⼈们约定在⼀个⼆进制数前⽤第⼀位(最⾼位)来表⽰符号,即1表⽰负,0表⽰正,这就是最初“原码”的概念。

“原码”就是“原始码位”,或者“原始编码”的意思,就是对应⼆进制数本⾝所代表的形式。

⽐如,+3(以8位字长为例,下同),符号位为0,3转化为⼆进制就是11,那么+3的原码就是00000011(最⾼位为符号位,正数的符号位为“0”,其余数值位不⾜部分补0)。

同理, -3的符号位为1,3转化为⼆进制就是11,最终-3的原码就是10000011(不⾜8位时在前⾯⽤0补⾜)。

在⽇常的书写中,原码的表⽰形式是⽤⽅括号下⾯加上⼀个“原”字下标来区别的,如[+3] 原= 00000011,[-3]原= 10000011。

再来计算+127和-127各⾃的原码。

+127中符号位为“0”,127的⼆进制为“1111111”,这样[+127]原=01111111;⽽-127中的符号位也为“1”,所以最终[-127]原=11111111。

最应该注意的是,在原码表⽰形式中,0有“+0”和“-0”之分。

对应的原码分别是0 0000000和1 0000000。

2.补码原码的设计很不错,⾄少可以成功地区分出⼆进制数的正与负了,但是这种⽅法仍有⼀些局限性,那就是原码在加、减法运算中不⽅便,符号位需要单独处理、单独判断。

同为正数的加、减是没什么问题的,可是异号相加、减时就存在问题了。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

原码、反码、补码、移码
正码、补码、反码、移码
数在计算机中是以二进制形式表示的。

数分为有符号数和无符号数。

原码、反码、补码都是有符号定点数的表示方法。

一个有符号定点数的最高位为符号位,0是正,1是负。

反码 = 原码(除符号位外)每位取反;
补码 = 反码 + 1;
反码 = 补码 - 1;
移码 = 补码符号位取反
以下都以8位整数为例,
原码就是这个数本身的二进制形式。

例如
0000001 就是+1
1000001 就是-1
正数的反码和补码都是和原码相同。

负数的反码是将其原码除符号位之外的各位求反
[-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 //负数时,补码为原码取反+1
0.1101
原码:0.1101
反码:0.1101 //正数时,反码=原码
补码:0.1101 //正数时,补码=原码
-0.1101
原码:1.1101
反码:1.0010 //负数时,反码为原码取反
补码:1.0011 //负数时,补码为原码取反+1
总结:
在计算机内,定点数有3种表示法:原码、反码和补码
所谓原码就是前面所介绍的二进制定点表示法,即最高位为符号位,“0”表示正,“1”表示负,其余位表示数值的大小。

反码表示法规定:正数的反码与其原码相同;负数的反码是对其原码逐位取反,但符号位除外。

补码表示法规定:正数的补码与其原码相同;负数的补码是在其反码的末位加1。

1、原码、反码和补码的表示方法
(1)原码:在数值前直接加一符号位的表示法。

例如:符号位数值位
[+7]原= 0 0000111 B
[-7]原= 1 0000111 B
注意:a. 数0的原码有两种形式:
[+0]原=00000000B [-0]原=10000000B
b. 8位二进制原码的表示范围:-127~+127
2)反码:
正数:正数的反码与原码相同。

负数:负数的反码,符号位为“1”,数值部分按位取反。

例如:符号位数值位
[+7]反= 0 0000111 B
[-7]反= 1 1111000 B
注意:a. 数0的反码也有两种形式,即
[+0]反=00000000B
[- 0]反=11111111B
b. 8位二进制反码的表示范围:-127~+127
3)补码的表示方法
1)模的概念:把一个计量单位称之为模或模数。

例如,时钟是以12进制进行计数循环的,即以12为模。

在时钟上,时针加上(正拨)12的整数位或减去(反拨)12的整数位,时针的位置不变。

14点钟在舍去模12后,成为(下午)2点钟(14=14-12=2)。

从0点出发逆时针拨10格即减去10小时,也可看成从0点出发顺时针拨2格(加上2小时),即2点
(0-10=-10=-10+12=2)。

因此,在模12的前提下,-10可映射为+2。

由此可见,对于一个模数为12的循环系统来说,加2和减10的效果是一样的;因此,在以12为模的系统中,凡是减10的运算都可以用加2来代替,这就把减法问题转化成加法问题了(注:计算机的硬件结构中只有加法器,所以大部分的运算都必须最终转换为加法)。

10和2对模12而言互为补数。

同理,计算机的运算部件与寄存器都有一定字长的限制(假设字长为8),因此它的运算也是一种模运算。

当计数器计满8位也就是256个数后会产生溢出,又从头开始计数。

产生溢出的量就是计数器的模,显然,8位二进制数,它的模数为2^8=256。

在计算中,两个互补的数称为“补码”。

2)补码的表示:正数:正数的补码和原码相同。

负数:负数的补码则是符号位为“1”,数值部分按位取反后再在末位(最低位)加1。

也就是“反码+1”。

例如:符号位数值位
[+7]补= 0 0000111 B
[-7]补= 1 1111001 B
补码在微型机中是一种重要的编码形式,请注意:
a.采用补码后,可以方便地将减法运算转化成加法运算,运算过程得到简化。

正数的补码即是它所表示的数的真值,而负数的补码的数值部份却不是它所表示的数的真值。

采用补码进行运算,所得结果仍为补码。

b.与原码、反码不同,数值0的补码只有一个,即 [0]补=00000000B。

c.若字长为8位,则补码所表示的范围为-128~+127;进行补码运算时,应注意所得结果不应超过补码所能表示数的范围
数值在计算机中表示形式为机器数,计算机只能识别0和1,使用的是二进制,而在日常生活中人们使用的是十进制,"正如亚里士多德早就指出的那样,今天十进制的广泛采用,只不过我们绝大多数人生来具有10个手指头这个解剖学事实的结果.
数值有正负之分,计算机就用一个数的最高位存放符号(0为正,1为负).这就是机器数的原码了.假设机器能处理的位数为8.即字长为1byte,原码能表示数值的范围为
(-127~-0 +0~127)共256个.
有了数值的表示方法就可以对数进行算术运算.但是很快就发现用带符号位的原码进行乘除运算时结果正确,而在加减运算的时候就出现了问题,如下: 假设字长为8bits
( 1 ) 10- ( 1 )10 = ( 1 )10 + ( -1 )10 = ( 0 )10
进行原码运算:(00000001)原+ (10000001)原= (10000010)原= ( -2 ) 显然不正确.
因为在两个正数的加法运算中是没有问题的,于是就发现问题出现在带符号位的负数身上。

对除符号位外的其余各位逐位取反就产生了反码(对于正数,其反码与原码相同).反码的取值空间和原码相同且一一对应. 下面是反码的减法运算:
( 1 )10 - ( 1 ) 10= ( 1 ) 10+ ( -1 ) 10= ( 0 )10
进行反码运算:(00000001) 反+ (11111110)反= (11111111)反= ( -0 ) 有问题.
- ( 2)10 = ( 1 )10 + ( -2 )10 = ( -1 )10
( 1 )
10
进行反码运算:(00000001) 反+ (11111101)反= (11111110)反= ( -1 ) 正确问题出现在(+0)和(-0)上,在人们的计算概念中零是没有正负之分的.(印度人首先将零作为标记并放入运算之中,包含有零号的印度数学和十进制计数对人类文明的贡献极大).
于是就引入了补码概念. 负数的补码就是对反码加一,而正数不变,正数的原码反码补码是一样的.在补码中用(-128)代替了(-0),所以补码的表示范围为:
(-128~0~127)共256个.
注意:(-128)没有相对应的原码和反码, (-128) = (10000000) 补码的加减运算如下:
( 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 )正确
所以补码的设计目的是:
⑴使符号位能与有效值部分一起参加运算,从而简化运算规则.
⑵使减法运算转换为加法运算,进一步简化计算机中运算器的线路设计
所有这些转换都是在计算机的最底层进行的,而在我们使用的汇编、C等其他高级语言中使用的都是原码。

看了上面这些大家应该对原码、反码、补码有了新的认识了吧!。

相关文档
最新文档