原码-反码-补码及运算
- 格式:doc
- 大小:53.50 KB
- 文档页数:18
原码、反码、补码、移码相互转换及其运算原码、反码、补码和移码的相互转换⼀、机器数 连同符号位⼀起数字化的数。
1.特点 ①符号数字化 ②数值的⼤⼩受机器字长的限制。
每个机器数所占的⼆进制位数受限于机器硬件规模,与机器字长有关。
超过机器字长的数位要被舍去。
2.真值:机器数中除“+”“-”符号外,其余部分表⽰的值。
3.分类 ①⽆符号数:机器字长的所有⼆进制位均表⽰数值。
②带符号数:数值部分和符号均为⼆进制代码表⽰,通常符号位位于最⾼位。
符号位“1”表⽰“-”,“0”表⽰“+”。
⼆、原码 原码是保持原有的数值部分的形式不变。
整数部分: 当0≤X<2n,[X]原=X [10011001]原= 010011001 当-2n<X≤0,[X]原=2n-X=2n+|X| [-10011001]原= 110011001 ⼩数部分: 当0 ≤ X<1,[X]原=X [0.10011001]原= 0.10011001 当-1<X ≤ 0,[X]原=1+|X| [-0.10011001]原= 1.110011001 ①将[X]原的符号取反即可得到[-X]原 【例题】设机器字长为8位,写出+37和-37的⼆进制。
解析:37得到的⼆进制数为100101,“+”为1,“-”为0,符号位在最⾼位 [+37]原=(+37)10=(+100101)2=(+00100101)2=00100101 [-37]原=(-37)10=(-100101)2=(-00100101)2=10100101 ②原码中0的表⽰不唯⼀ 整数原码:[+0]原=00...0 [-0]原=10 0 ⼩数原码:[+0]原=0.00...0 [-0]原=1.00 0 ③原码的移位规则:符号位不变,数值部分左移或右移,移出的空位归0。
左移是乘法,右移是除法。
移动n位是乘或除2n。
【例⼦】 [0.0110000]原=0.0110000 [0.0110000]原÷2=0.0011000 [0.0110000]原×2=0.1100000三、反码 ①反码与原码的关系 当X≥0,[X]反=[X]原 当X<0,[X]反=[X]原的位取反(符号位不变) 【例⼦】 [+0.1001100]反=0.1001100 [-0.1001100]反=1.0110011 [+1001100]反=01001100 [-1001100]反=10110011 ②反码中0的表⽰不唯⼀ [+0]反=00...0 [-0]反=11 (1)四、补码 补码的⽬的是使得减法也可以按照加法的⽅式来计算(加减法);同时,补码可以将数的符号位和数值域采⽤统⼀⽅式处理。
⼆进制原码,反码,补码的基础概念和计算⽅法⼀. 原码, 反码, 补码的基础概念和计算⽅法.1. 原码:原码就是符号位加上真值的绝对值, 即⽤第⼀位表⽰符号, 其余位表⽰值. ⽐如如果是8位⼆进制: [+1]原 = 0000 0001 [-1]原 = 1000 0001第⼀位是符号位. 因为第⼀位是符号位, 所以8位⼆进制数的取值范围就是:[1111 1111 , 0111 1111]即[-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=0如果⽤原码表⽰:1 - 1 = 1 + (-1) = [00000001]原 + [10000001]原 = [10000010]原 = -2让符号位也参与计算, 显然对于减法来说, 结果是不正确的.这也就是为何计算机内部不使⽤原码表⽰⼀个数. 如果⽤反码表⽰: 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. ⽤补码表⽰: 1-1 = 1 + (-1) = [0000 0001]原 + [1000 0001]原 = [0000 0001]补 + [1111 1111]补 = [0000 0000]补 =[0000 0000]原 =0 这样0⽤[0000 0000]表⽰, ⽽以前出现问题的-0则不存在了.⽽且可以⽤[1000 0000]表⽰-128: (-1) + (-127) = [1000 0001]原 + [1111 1111]原 = [1111 1111]补 + [1000 0001]补 = [1000 0000]补 =-128注:-1-127的结果应该是-128, 在⽤补码运算的结果中, [1000 0000]补就是-128. 但是注意因为实际上是使⽤以前的-0的补码来表⽰-128, 所以-128并没有原码和反码表⽰.(对-128的补码表⽰[1000 0000]补算出来的原码是[0000 0000]原, 这是不正确的) 使⽤补码, 不仅仅修复了0的符号以及存在两个编码的问题, ⽽且还能够多表⽰⼀个最低数. 这就是为什么8位⼆进制, 使⽤原码或反码表⽰的范围为[-127, +127], ⽽使⽤补码表⽰的范围为[-128, 127]. (-1) + (-1) = [1000 0001]原 + [1000 0001]原 = [1111 1111]补 + [1111 1111]补 = [1111 1110]补 //负数原码=补码-1,再同位取反,符号位不变 =[1000 0010]原 =-2因为机器使⽤补码, 所以对于编程中常⽤到的32位int类型, 可以表⽰范围是: [-231, 231-1] 因为第⼀位表⽰的是符号位.⽽使⽤补码表⽰时⼜可以多保存⼀个最⼩值.。
原码,反码,补码及其运算
1)简述
原码: ⽤来转换对应进制.
反码: ⼆进制码0变1,1变0叫做反码,反码⽤于原码补码之间的转换.(符号位不变)。
补码: ⽤来做数据的存储运算. 补码提出的根源是让计算机底层的实现减法操作(可以表达出⼀个数的正负)。
2)运算规则
(原码反码补码之间的转换 , 符号位不要动)
正数: 原码 = 反码 = 补码
负数: 原码 = 补码取反加1 给补码求原码
负数: 补码 = 原码取反加1 给原码求补码
求12 +(- 15) = ?
补码⽤来做数据的存储运算,因此先求12和-15的补码
12的补码(=反码=原码):0000 1100(⾼位为0,表⽰正数)
-15的原码: 1000 1111 (⾼位为1,表⽰负数,转换为10进制时,⾼位的1不⽤进⾏换算)
反码: 1111 0000 (原码取反)
补码: 1111 0001 (反码加1)
补码做相加运算
12的补码: 0000 1100
-15的补码: 1111 0001
-------------
结果(补码): 1111 1101
补码再转换为原码(即补码的补码,同样做取反加1换算)
补码: 1111 1101(⾼位为1,表⽰负数,进⾏补码反码原码换算时是不变的)
反码: 1000 0010(补码取反)
原码: 1000 0011(反码加1)
10进制: -3。
反码在计算机内,定点数有3种表示法:原码、反码和补码。
所谓原码就是前面所介绍的二进制定点表示法,即最高位为符号位,“0”表示正,“1”表示负,其余位表示数值的大小。
反码表示法规定:正数的反码与其原码相同;负数的反码是对其原码逐位取反,但符号位除外。
补码表示法规定:正数的补码与其原码相同;负数的补码是在其反码的末位加1。
1、原码、反码和补码的表示方法(1)原码:在数值前直接加一符号位的表示法。
例如:符号位数值位[+7]原= 0 0000111 B[-7]原= 1 0000111 B注意:a. 数0的原码有两种形式: [+0]原=00000000B [-0]原=10000000Bb. 8位二进制原码的表示范围:-127~+127(2)反码:正数:正数的反码与原码相同。
负数:负数的反码,符号位为“1”,数值部分按位取反。
例如:符号位数值位[+7]反= 0 0000111 B[-7]反=1 1111000B注意:a.数0的反码也有两种形式,即 [+0]反=00000000B[- 0]反=11111111Bb. 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)。
原码,反码,补码及运算一、定义 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~+32767 2.反码 对于一个带符号的数来说,正数的反码与其原码相同,负数的反码为其原码除符号位以外的各位按位取反。
【例2.14】当机器字长为8位二进制数时: X=+1011011 [X]原码=01011011 [X]反码=01011011 Y=-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为机器字长。
原码反码补码加减运算===========================================================================================处理器对两个操作数进⾏运算时,按照⽆符号数求得结果,并相应设置进位标志C;同时,根据是否超出有符号数的范围设置溢出标志V。
应该利⽤哪个标志,则由程序员来决定。
也就是说,如果将参加运算的操作数认为是⽆符号数,就应该关⼼进位;认为是有符号数,则要注意是否溢出。
所有的负数的反码等于原码各位取反;补码等于反码加⼀. ⼗六进制也是先化成2进制的在化补码。
补码的⽤途是让机器学会减法运算的。
应为所有的处理器是电路做的,电路其实只是加法器,只能做加法。
如何能让电脑做减法呢,就⽤补码啊。
减去⼀个数就等于加上她的补码。
原码加减法⽐较复杂,需要事先判断数的符号,然后决定做加法还是做减法运算。
补码的加减法运算⽐较简单,采⽤补码加减法运算,可将“正数加负数”的操作,转化为“正数加正数”的操作。
⼀般计算机采取补码进⾏加减法运算。
因减法运算可看作被减数加上⼀个减数的负值,即A-B=A+(-B),故在此将机器中的减法运算和加法运算合在⼀起讨论。
===========================================================================================1. 补码加减的基本公式.补码加法的基本公式为:整数 [A]补+[B]补=[A+B]补 (mod 2n+1)⼩数 [A]补+[B]补=[A+B]补 (mod 2).对于减法因A-B=A+(-B),则[A-B]补=[A+(-B)]补,由补码加法基本公式可得:整数 [A-B]补=[A]补+[-B]补 (mod 2n+1)⼩数 [A-B]补=[A]补+[-B]补 (mod 2)[X+Y]补= [X]补+[Y]补 [X-Y]补= [X]补+[-Y]补运算过程举例(假设机器字长4位,其中1位表⽰符号位):补码的加、减法的例⼦(a) (-7)+(+5) (b)(-4)+(+4)1,001 1,1000,101 0,1001,110 =-2 0,000 =0(c) (+5)+(+4) (d)(-7)+(-6)0,101 1,0010,100 1,0101,001 =溢出 0,011 =溢出计算机中这种超出机器字长的现象,称为溢出。
原码反码补码乘除规则原码、反码、补码是计算机中存储和运算的三种表示方式。
它们的存在是为了解决符号位(即最高位)的问题,即正负数的表示方式,遵循的是二进制的加减以及进位制度,用来解决操作溢出问题。
原码是二进制中最常见的表示方法,符号位为0表示正数,为1表示负数。
例如,8位二进制数00001001表示正数9,11111001表示负数-9。
反码也是二进制数表示方法中常用的一种方式。
一个数的反码的符号位与原码相同,而其余位取反。
例如,8位二进制数00001001的反码是00001001,11111001的反码是10000110。
补码是二进制数表示中最常用的一种方式,它是计算机中存储和处理数据的主要方式。
补码的符号位与原码和反码的符号位相同,其余位的求法是在反码的基础上加1。
例如,8位二进制数00001001的补码是00001001,11111001的补码是10001001。
乘法和除法是数学运算中的两个基本要素,同样在计算机中也具有重要的作用。
当计算机进行乘法和除法时,需要遵守一定的规则。
乘法规则:对于两个数相乘,如果两个数的符号相同,则结果为正数,反之为负数。
同时,对于乘数和被乘数的最高位,其符号位可以省略,因为它们的符号可以根据乘积的符号来推断。
除法规则:对于两个数相除,如果两个数的符号相同,则结果为正数,反之为负数。
当被除数和除数为0时,需要抛出异常,因为除数不能为0。
此外,在进行整数除法时,需要注意舍入的方式,应该向0舍入。
综上所述,原码、反码、补码是计算机中所使用的三种数值表示方法。
在进行乘法和除法时,应该遵守一定的规则。
这些知识对于理解计算机底层的运算过程以及提高计算机编程的能力具有重要的意义。
原码、反码、补码之间的快速转换和简单运算
现在很多⼈都在学习计算机语⾔,那么原码、反码、补码之间的快速转换和简单运算是怎么样的呢?今天⼩编为⼤家讲讲具体的⽅法,希望能够对⼤家有所帮助。
正数部分:
正整数的原码、反码和补码是⼀样的,即看到符号位(第⼀位)是0,就可以照着写出其他两种码。
负数部分转换:
原码和反码的相互转换:符号位不变,数值位按位取反
原码和补码的相互转换:符号位不变,数值位按位取反,末位再加1
已知补码,求原码的负数的补码:符号位和数值位都取反,末位再加1
负数部分具体情况:
1) 原码转换为反码:符号位不变,数值位分别“按位取反”
2) 反码转换为原码也是⼀样:符号位不变,数值位分别“按位取反”
3) 原码转换为补码:符号位不变,数值位按位取反,末位再加1
4) 补码转换为原码:符号位不变,数值位按位取反,末位再加1。
即补码的补码等于原码
5) 求补(变补),即已知[X]补,求[-X]补。
符号位和数值位都取反,末位再加1。
反码补码原码的运算规则
以下是 6 条关于反码补码原码的运算规则:
1. 哎呀呀,原码就是最直接的表示啦!比如 5 的原码就是呀。
2. 嘿,反码可有意思了哦!正数的反码就是它本身,负数的反码是除符号位外其他位取反呢。
就像-5 的反码是哟。
3. 哇塞,补码才神奇呢!正数的补码还是它自己,负数的补码是反码加1 呀。
像-3 的补码就是呀,你说妙不妙?
4. 你想想看呀,在进行加法运算的时候用补码多方便呀!比如 3 和-2 相加,用它们的补码和相加,结果一下子就出来了呢,是不是很厉害?
5. 哎呀呀,如果要进行减法运算,也可以通过补码来转化成加法呀!就像 5 减 3,可以变成 5 加-3 的补码呀,这多有意思,你难道不想试试?
6. 还有哦,在计算机里经常用到这些规则呀。
我们可不能小瞧它们呀!它们可是让计算机的运算变得准确又高效呢!
我的观点结论:反码补码原码的运算规则真的超级重要呀,是计算机运算的基础呢,我们一定要好好掌握呀!。
原码,反码,补码,和取反运算——适⽤于⼆进制底层的概念理解⾸先,看这篇⽂章之前,你需要的是不必纠结,⽐如:为什么正数的原码反码补码就⼀样呢,负数的原码反码补码就各不相同呢?看这篇⽂章之前你只需要记住,这是⼈为规定的。
你可能会想,为什么要这样⼈为规定呢,我现在只能告诉你,这样规定有利于计算机底层对数字进⾏操作,也就是说,这种规定对计算机的底层硬件要求简化了,技术实现起来更简单。
我们⽇常⽤的数字是给我们⼈类⽤的,所以叫真值。
⽽机器(计算机)理解的数字通常是⼆进制所组成的数字,所以称为机器数。
⼆进制在内存中以补码形式在其中存储,计算机计算数字是通过补码的形式进⾏计算的,也就是说不管正数,还是负数在计算机⾥⾯,都要⽤补码来表⽰。
在原码,反码,补码中,最⾼位来表⽰正负,⽤0表是正,1表⽰负;如⼗进制的10表⽰为:+1010--->原码:0 1010;-1010--->原码: 1 1010;笔记⼀:原码,反码,补码*规则:正数中:原码=反码=补码;例⼦拿上⾯的:+1010---> 0 1010;+1010--->原码: 0 1010;(最⾼位0表⽰正号)+1010--->反码: 0 1010;+1010--->补码: 0 1010;+1010--->移码: 1 1010(补码符号位取反)负数中的规则如下:例⼦拿上⾯的:-1010---> 1 1010;-1010--->原码: 1 1010;(最⾼位1表⽰负号)-1010--->反码: 1 0101;(符号位不变,数值位:0变1,1变0)-1010--->补码: 1 0110;(符号位不变,数值位:0变1,1变0。
最后得出来的数字再加1。
简单点总结为:“反码加1”)-1010--->移码: 0 0110(补码符号位取反)最后注释:移码:⽆论正负数,都是补码的符号位取反。
还有这⾥解释⼀下,为什么计算机实际计算数字是⽤补码进⾏运算的,如果你看了我上⾯的例⼦的话,应该清楚了,不管是正数,还是负数,在计算机中,补码最⾼位都是1,意思就是说,补码的作⽤,把正数规定还是正数,⽽负数还是负数,但是正负数进⾏运算的时候转变为加法形式,例如:3-5变成3+(-5).这样⼦,计算机底层很容易实现加法运算。
原码,反码,补码及运算一、定义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. 原码原码就是符号位加上真值的绝对值, 即⽤第⼀位表⽰符号, 其余位表⽰值. ⽐如如果是8位⼆进制:[+1]原 = 0000 0001[-1]原 = 1000 0001第⼀位是符号位. 因为第⼀位是符号位, 所以8位⼆进制数的取值范围就是:[1111 1111 , 0111 1111]即[-127 , 127]原码是⼈脑最容易理解和计算的表⽰⽅式.1. 反码反码的表⽰⽅法是:正数的反码是其本⾝负数的反码是在其原码的基础上, 符号位不变,其余各个位取反.[+1] = [00000001]原 = [00000001]反[-1] = [10000001]原 = [11111110]反可见如果⼀个反码表⽰的是负数, ⼈脑⽆法直观的看出来它的数值. 通常要将其转换成原码再计算.1. 补码补码的表⽰⽅法是:正数的补码就是其本⾝负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1. (即在反码的基础上+1)[+1] = [00000001]原 = [00000001]反 = [00000001]补[-1] = [10000001]原 = [11111110]反 = [11111111]补对于负数, 补码表⽰⽅式也是⼈脑⽆法直观看出其数值的. 通常也需要转换成原码在计算其数值.负数采⽤补码编码:例如char t=-2,原码是1010,则反码是:1101,补码是:1110,即-2的机器表⽰为1110;因为c语⾔中规定同级别的⽆符号数的精度⾼于有符号数,所以会隐式地将:有符号数转为⽆符号数(底层位级表⽰不变,只是解读⽅式不同)。
#include<stdio.h>#include<stdlib.h>void main(){ int a = -3; unsigned int b = 2; long c = a + b; printf("%ld\n",c);}A:-1B:4294967295C:0x7FFFFFFFD:0xFFFFFFFF正确答案为:AB解析:⽆符号和有符号整数进⾏运算时,有符号整数会被提升为⽆符号整数。
1、在计算机系统中,数值一律用补码来表示(存储)。
主要原因:使用补码,可以将符号位和其它位统一处理;同时,减法也可按加法来处理。
另外,两个用补码表示的数相加时,如果最高位(符号位)有进位,则进位被舍弃。
2、补码与原码的转换过程几乎是相同的。
数值的补码表示也分两种情况:(1)正数的补码:与原码相同。
例如,+9的补码是00001001。
(2)负数的补码:符号位为1,其余位为该数绝对值的原码按位取反;然后整个数加1。
例如,-7的补码:因为是负数,则符号位为“1”,整个为10000111;其余7位为-7的绝对值+7的原码0000111按位取反为1111000;再加1,所以-7的补码是11111001。
已知一个数的补码,求原码的操作分两种情况:(1)如果补码的符号位为“0”,表示是一个正数,所以补码就是该数的原码。
(2)如果补码的符号位为“1”,表示是一个负数,求原码的操作可以是:符号位为1,其余各位取反,然后再整个数加1。
例如,已知一个补码为11111001,则原码是10000111(-7):因为符号位为“1”,表示是一个负数,所以该位不变,仍为“1”;其余7位1111001取反后为0000110;再加1,所以是10000111。
补码只不过是用来表示带符号数而已.补码的原则是:正数的补码是其本身,也就是原码.负数的补码是各位取反后加1.也就是其反码加1.+0的补码就是其原码,也就是说是0000 0000而已(对于8位来说)-0的补码是其反码加1,其反码是1111 1111,当然,其反码加1后就是溢出一个进位后,仍然是0000 0000.0只有1种补码正数的原码、反码、补码是同一个数0正1负3、“模”是指一个计量系统的计数范围。
如时钟等。
计算机也可以看成一个计量机器,它也有一个计量范围,即都存在一个“模”。
例如:时钟的计量范围是0~11,模=12。
表示n位的计算机计量范围是0~2(n)-1,模=2(n)。
原码反码补码详解⼀. 机器数和真值在学习原码, 反码和补码之前, 需要先了解机器数和真值的概念.1.机器数⼀个数在计算机中的⼆进制表⽰形式, 叫做这个数的机器数。
2.真值机器数的实际值称为真值。
3.符号数和⽆符号数符号数和⽆符号数是针对符号出现的两种机器数表⽰⽅法。
同⼀个⼆进制数,对符号数和⽆符号数具有不同的含义。
符号数如: char, short ,int, long等类型的变量⽆符号数如:unsigned char, unsigned short , unsigned int, unsigned long, 指针等类型的变量4.定点数与浮点数定点数和浮点数是针对⼩数点出现的两种机器数表⽰⽅法。
⼆. 原码, 反码, 补码的基础概念和计算⽅法只有符号数才有原码, 反码, 补码在探求为何机器要使⽤补码之前, 让我们先了解原码, 反码和补码的概念.对于⼀个数, 计算机要使⽤⼀定的编码⽅式进⾏存储. 原码, 反码,补码是机器存储⼀个具体数字的⼀种编码⽅式.1. 原码原码就是符号位加上真值的绝对值, 即⽤第⼀位表⽰符号, 其余位表⽰值. ⽐如如果是8位⼆进制:[+1]原 = 0000 0001[-1]原 = 1000 0001第⼀位是符号位. 因为第⼀位是符号位, 所以8位⼆进制数的取值范围就是:[1111 1111 , 0111 1111]即[-127 , 127]2. 反码反码的表⽰⽅法是:正数的反码是其本⾝,负数的反码是在其原码的基础上, 符号位不变,其余各个位取反.[+1] = [00000001]原 = [00000001]反[-1] = [10000001]原 = [11111110]反可见如果⼀个反码表⽰的是负数, ⼈脑⽆法直观的看出来它的数值. 通常要将其转换成原码再计算.3. 补码补码的表⽰⽅法是:正数的补码就是其本⾝负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1. (即在反码的基础上+1)[+1] = [00000001]原 = [00000001]反 = [00000001]补[-1] = [10000001]原 = [11111110]反 = [11111111]补对于负数, 补码表⽰⽅式也是⼈脑⽆法直观看出其数值的. 通常也需要转换成原码在计算其数值.三. 为何要使⽤原码, 反码和补码1.使⽤补码,可以将符号位和其它位统⼀处理;同时,减法也可按加法来处理。
原码反码补码知识点一、知识概述《原码反码补码知识点》①基本定义:- 原码呢,就是一种最简单的机器数表示法。
就是把这个数直接写成二进制的形式,最左边那位是符号位,0表示正数,1表示负数,后面跟着这个数的绝对值对应的二进制数。
比如数字5,它的原码(假设是8位)就是;要是-5呢,那就是。
- 反码,正数的反码跟原码一样。
负数的反码呢,就是在原码的基础上,除了符号位,其他的位都取反,就像照镜子一样,0变1,1变0。
好比-5的原码是,那它的反码就是。
- 补码也挺有意思的。
正数的补码跟原码相同。
负数的补码是先求反码,然后在反码的最低位加1。
还说-5吧,它的反码是,补码就是了。
②重要程度:在计算机的运算里,原码、反码和补码可太重要了。
计算机只能处理0和1的二进制数据,通过这几种码的转换,才能准确地进行算术运算和逻辑判断呢,就像汽车需要油才能跑起来一样,计算机做这些运算就离不开它们。
③前置知识:得先对二进制有个基本的了解,知道怎么把一个十进制数转换成二进制数,还有位运算的一些基本知识,像与、或、非这种基本操作。
要是连二进制都搞不明白,那原码反码补码就像天书一样喽。
④应用价值:在计算机的处理器运算中,比如说简单的加法减法,都离不开原码反码补码的转换。
在很多编程操作里,当涉及到对内存中的数据进行数值计算的时候,这也是必须知道的内容。
就好像建房子必须有砖一样,做计算机底层的编码或者高效率运算,这些码就是基础的“砖”。
二、知识体系①知识图谱:在计算机科学中,原码反码补码属于计算机数值表示和运算这个知识板块里面的基础内容。
它们和二进制运算、计算机的算术逻辑单元等知识都有紧密联系。
②关联知识:和数据的存储方式有关联,像在内存中数据是按照这些码的形式存放的,还和计算机的指令系统有关联。
比如处理器的指令集在执行加、减、乘、除等运算时,就需要先理解这些数是怎么表示的,也就是原码反码补码。
③重难点分析:- 重点就是能够准确地根据正负和给定的十进制数转换出原码、反码和补码,并且在它们之间熟练转换。
由老师给家讲解计算机的原码,反码和补码。
并且进行了深入探求了为何要使用反码和补码,以及更进一步的论证了为何可以用反码,补码的加法计算原码的减法。
一、机器数和真值在学习原码,反码和补码之前,需要先了解机器数和真值的概念。
1、机器数一个数在计算机中的二进制表示形式,叫这个数的机器数。
机器数带符号的,在计算机用一个数的位存放符号,正数为0,负数为1.比如,十进制中的数+3,计算机字长为8位,转换成二进制就00000011。
如果-3,就10000011。
那么,这里的00000011和10000011就机器数。
2、真值机器数的位符号位,后边才真正的数值,所以机器数的形式值就不等于真正的数值。
例如上面的有符号数10000011,其位1代表负,其真正数值-3而不形式值131(10000011转换成十进制等于131)。
所以,为区别起见,将带符号位的机器数对应的真正数值称为机器数的真值。
例:00000001的真值=+0000001=+110000001的真值=–0000001=–1二、原码,反码,补码的基础概念和计算方法在探求为何机器要使用补码之前,让们先了解原码,反码和补码的概念。
对于一个数,计算机要使用一定的编码进行存储。
原码,反码,补码机器存储一个具体数字的编码。
1.原码原码就符号位加上真值的值,即用位表示符号,其余位表示值。
比如如果8位二进制:[+1](原码)=00000001[-1](原码)=10000001位符号位。
因为位符号位,所以8位二进制数的取值范围就:[11111111,01111111]即[-127,127]原码人脑最容易理解和计算的表示。
2.反码反码的表示方法:正数的反码其本身,负数的反码在其原码的基础上,符号位不变,其余各个位取反。
[+1]=[00000001](原码)=[00000001](反码)[-1]=[10000001](原码)=[11111110](反码)可见如果一个反码表示的负数,人脑无法直观的看出来它的数值。
原码,补码,反码正数的原码,补码,反码都相同,都等于它本身负数的补码是:符号位为1,其余各位求反,末位加1反码是:符号位为1,其余各位求反,但末位不加1也就是说,反码末位加上1就是补码1100110011 原1011001100 反除符号位,按位取反1011001101 补除符号位,按位取反再加1正数的原反补是一样的在计算机中,数据是以补码的形式存储的:在n位的机器数中,最高位为符号位,该位为零表示为正,为1表示为负;其余n-1位为数值位,各位的值可为0或1。
当真值为正时:原码、反码、补码数值位完全相同;当真值为负时:原码的数值位保持原样,反码的数值位是原码数值位的各位取反,补码则是反码的最低位加一。
注意符号位不变。
如:若机器数是16位:十进制数17 的原码、反码与补码均为:0000000000010001十进制数-17 的原码、反码与补码分别为:1000000000010001、1111111111101110、111111*********1、在计算机系统中,数值一律用补码来表示(存储)。
主要原因:使用补码,可以将符号位和其它位统一处理;同时,减法也可按加法来处理。
另外,两个用补码表示的数相加时,如果最高位(符号位)有进位,则进位被舍弃。
2、补码与原码的转换过程几乎是相同的。
数值的补码表示也分两种情况:(1)正数的补码:与原码相同。
例如,+9的补码是00001001。
(2)负数的补码:符号位为1,其余位为该数绝对值的原码按位取反;然后整个数加1。
例如,-7的补码:因为是负数,则符号位为“1”,整个为10000111;其余7位为-7的绝对值+7的原码0000111按位取反为1111000;再加1,所以-7的补码是11111001已知一个数的补码,求原码的操作分两种情况:(1)如果补码的符号位为“0”,表示是一个正数,所以补码就是该数的原码。
(2)如果补码的符号位为“1”,表示是一个负数,求原码的操作可以是:符号位为1,其余各位取反,然后再整个数加1。
原码、反码和补码的计算方法一、原码表示法原码表示法是一种最简单的数值表示方法,它将数值的绝对值转换为二进制形式,并在最高位为符号位,正数为0,负数为1。
例如,+7和-7的原码表示如下:+7: 0111-7: 1111原码表示法可以直接进行加减运算,但由于符号位和数值位混在一起,计算时容易出错。
二、反码表示法反码表示法将原码符号位不变,其余各位取反,正数反码与原码相同,负数的反码是对其原码取反(除符号位外)。
例如,+7和-7的反码表示如下:+7: 0111-7: 1000反码表示法在进行加减运算时,可以避免符号位的干扰,提高了计算的准确性。
但需要注意的是,在进行反码加法运算时,可能会出现“溢出”的情况,即结果超出反码表示的范围。
三、补码表示法补码表示法是一种为了方便计算机进行加减运算而采用的一种编码方式。
它也是在原码的基础上进行变换,正数的补码与其原码相同,负数的补码是在其反码的基础上加1。
例如,+7和-7的补码表示如下:+7: 0111-7: 1001补码表示法在进行加减运算时,不仅可以避免符号位的干扰,而且可以直接进行加减运算,无需考虑溢出问题。
因此,补码表示法被广泛应用于计算机系统中。
四、原码、反码和补码的转换在进行数值计算时,需要根据实际情况选择合适的编码方式。
对于不同的编码方式,需要进行相应的转换。
下面介绍原码、反码和补码之间的转换方法:1. 原码转反码:对于正数,其反码与原码相同;对于负数,将其原码除符号位外全部取反。
2. 原码转补码:对于正数,其补码与原码相同;对于负数,将其反码加1。
3. 反码转补码:对于正数和负数,直接将反码加1。
4. 补码转原码:对于正数和负数,直接将补码减1(对于负数需要借位)。
五、应用场景原码、反码和补码都有各自的应用场景。
原码通常用于教育和科研领域;反码在硬件设计和通信领域中广泛应用;而补码则在计算机系统和信号处理中占据主导地位。
在实际应用中,我们需要根据具体需求选择合适的编码方式。
原码,反码,补码及运算一、定义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为机器字长。
则:8位二进制补码表示的整数范围是-128~+127(-128 表示为10000000,无对应的原码和反码)16位二进制补码表示的整数范围是-32768~+32767当运算结果超出这个范围时,就不能正确表示数了,此时称为溢出。
所以补码的设计目的是:⑴使符号位能与有效值部分一起参加运算,从而简化运算规则.⑵使减法运算转换为加法运算,进一步简化计算机中运算器的线路设计4.补码与真值之间的转换正数补码的真值等于补码的本身;负数补码转换为其真值时,将负数补码按位求反,末位加1,即可得到该负数补码对应的真值的绝对值。
【例2.16】[X]补码=01011001B,[X]补码=11011001B,分别求其真值X。
(1)[X]补码代表的数是正数,其真值:X=+1011001B=+(1×26+1×24+1×23+1×20)=+(64+16+8+1)=+(89)D(2)[X]补码代表的数是负数,则真值:X=-([1011001]求反+1)B=-(0100110+1)B=-(0100111)B=-(1×25+1×22+1×21+1×20)=-(32+4+2+1)=-(39)D二、补码加、减运算规则1、运算规则[X+Y]补= [X]补+ [Y]补[X-Y]补= [X]补+ [-Y]补若已知[Y]补,求[-Y]补的方法是:将[Y]补的各位(包括符号位)逐位取反再在最低位加1即可。
例如:[Y]补= 101101 [-Y]补= 0100112、溢出判断,一般用双符号位进行判断:符号位00 表示正数 11 表示负数结果的符号位为01时,称为上溢;为10时,称为下溢例题:设x=0.1101,y=-0.0111,符号位为双符号位用补码求x+y,x-y[x]补+[y]补=00 1101+11 1001=00 0110[x-y]补=[x]补+[-y]补=00 1101+00 0111=01 0100结果错误,正溢出数值在计算机中表示形式为机器数,计算机只能识别0和1,使用的是二进制,而在日常生活中人们使用的是十进制.数值有正负之分,计算机就用一个数的最高位存放符号(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 ) 有问题.( 1 )10 - ( 2)10 = ( 1 )10 + ( -2 )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等其他高级语言中使用的都是原码。
看了上面这些你应该对原码、反码、补码有了新的认识了吧在计算机内,定点数有3种表示法:原码、反码和补码所谓原码就是前面所介绍的二进制定点表示法,即最高位为符号位,“0”表示正,“1”表示负,其余位表示数值的大小。
反码表示法规定:正数的反码与其原码相同;负数的反码是对其原码逐位取反,但符号位除外。
补码表示法规定:正数的补码与其原码相同;负数的补码是在其反码的末位加1。
1、原码、反码和补码的表示方法(1)原码:在数值前直接加一符号位的表示法。
例如:符号位数值位[+7]原= 0 0000111 B[-7]原= 1 0000111 B注意:a. 数0的原码有两种形式:[+0]原=00000000B [-0]原=10000000Bb. 8位二进制原码的表示范围:-127~+127 (2)反码:正数:正数的反码与原码相同。
负数:负数的反码,符号位为“1”,数值部分按位取反。
例如:符号位数值位[+7]反= 0 0000111 B[-7]反= 1 1111000 B注意:a. 数0的反码也有两种形式,即[+0]反=00000000B[- 0]反=11111111Bb. 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位二进制数,它的模数为28=256。
在计算中,两个互补的数称为“补码”。
2)补码的表示:正数:正数的补码和原码相同。
负数:负数的补码则是符号位为“1”,数值部分按位取反后再在末位(最低位)加1。
也就是“反码+1”。
例如:符号位数值位[+7]补= 0 0000111 B[-7]补= 1 1111001 B补码在微型机中是一种重要的编码形式,请注意:a. 采用补码后,可以方便地将减法运算转化成加法运算,运算过程得到简化。
正数的补码即是它所表示的数的真值,而负数的补码的数值部份却不是它所表示的数的真值。
采用补码进行运算,所得结果仍为补码。
b. 与原码、反码不同,数值0的补码只有一个,即 [0]补=00000000B。
c. 若字长为8位,则补码所表示的范围为-128~+127;进行补码运算时,应注意所得结果不应超过补码所能表示数的范围。
2.原码、反码和补码之间的转换由于正数的原码、补码、反码表示方法均相同,不需转换。
在此,仅以负数情况分析。
(1)已知原码,求补码。
例:已知某数X的原码为10110100B,试求X的补码和反码。
解:由[X]原=10110100B知,X为负数。
求其反码时,符号位不变,数值部分按位求反;求其补码时,再在其反码的末位加1。
1 0 1 1 0 1 0 0 原码1 1 0 0 1 0 1 1 反码,符号位不变,数值位取反1 +11 1 0 0 1 1 0 0 补码故:[X]补=11001100B,[X]反=11001011B。