原码,反码与补码怎么计算的

作者&投稿:石类 (若有异议请与网页底部的电邮联系)
补码、原码、反码怎么运算?~

原码, 反码和补码的概念.对于一个数, 计算机要使用一定的编码方式进行存储. 原码, 反码, 补码是机器存储一个具体数字的编码方式。原码就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值。反码就是正数的反码是其本身,负数的反码是在其原码的基础上, 符号位不变,其余各个位取反。补码就是正数的补码就是其本身,负数的补码是在其原码的基础上, 符号位不变, 其余各位取反。
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 = 1 + (-1) = 0 , 所以机器可以只有加法而没有减法, 这样计算机运算的设计就更简单了。
于是人们开始探索 将符号位参与运算, 并且只保留加法的方法. 首先来看原码:
计算十进制的表达式: 1-1=0
1 - 1 = 1 + (-1) = [00000001]原 + [10000001]原 = [10000010]原 = -2
如果用原码表示, 让符号位也参与计算, 显然对于减法来说, 结果是不正确的.这也就是为何计算机内部不使用原码表示一个数。
为了解决原码做减法的问题, 出现了反码:
计算十进制的表达式: 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] 因为第一位表示的是符号位.而使用补码表示时又可以多保存一个最小值。

计算机中的存储系统都是用2进制储存的,对我们输入的每一个信息它都会自动转变成二进制的形式,而二进制在存储的时候就会用到原码,反码和补码
例如:输入25
原码就是:0000000000011001
反码: 1111111111100110
补码: 1111111111100111

数值在计算机中表示形式为机器数,计算机只能识别0和1,使用的是二进制,而在日常生活中人们使用的是十进制,"正如亚里士多德早就指出的那样,今天十进制的广泛采用,只不过我们绝大多数人生来具有10个手指头这个解剖学事实的结果.尽管在历史上手指计数(5,10进制)的实践要比二或三进制计数出现的晚. "(摘自>有空大家可以看看哦~,很有意思的).为了能方便的与二进制转换,就使用了十六进制(2 4)和八进制(23).下面进入正题.

数值有正负之分,计算机就用一个数的最高位存放符号(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等其他高级语言中使用的都是原码

举例说明如下
真值 -11d = -1011b , 若字长8位, 则:
[-11d]原 =10001011b , 最高位是符号位,1表示负数,其余为数值位
符号位右侧的3个0用于补齐8位
[-11d]反 =11110100b , 将原码除符号位之外的各位取反得反码
[-11d]补 =11110101b ,将反码末位加1得补码
若真值是正数,无须上述操作,正数的原码反码补码符号位为0,数值与真值相同
例如:[+19d]原 =[+19d]反 = [+19d]补 = 00010011b
符号位右侧的2个0用于补齐8位
( d是十进制数后缀 , b是二进制数后缀 )




原码反码补码概念(原码反码补码)
您好,我就为大家解答关于原码反码补码概念,原码反码补码相信很多小伙伴还不知道,现在让我们一起来看看吧!1、请我给你的详解:原码、补... 您好,我就为大家解答关于原码反码补码概念,原码反码补码相信很多小伙伴还不知道,现在让我们一起来看看吧! 1、请我给你的详解:原码、补码和反码(1)原码表示法 原码表示法是...

原码,反码,补码,是什么?
带符号数,有三种表示方法,即:原码、反码和补码。但是,在计算机系统中,数值一律用【补码】来表示和存储。所以,在计算机系统中,原码和反码,都是不存在的。使用补码的意义:可以把减法或负数,转换为加法运算。因此,就能简化计算机的硬件。=== 补码的概念,来自于:补数。比如钟表,时针转一圈...

什么是一个数的原码,反码,补码
原码,反码,补码针对的是定长二进制存储器表示的有符号整数。正数的原码,反码,补码都相同。负数的原码最高位为1,其他位为整数的绝对值(零有+0、-0之分)。负数的反码最高位为1,其他位为整数的绝对值按位取反(零有+0、-0之分)。负数的补码最高位为1,其他位为整数的绝对值按位取反再...

原码,反码,补码的编码规则?
计算机中,使用 1、0 构成各种代码。对于正负数字,只是使用【补码】来存储与计算。原码反码,在计算机中,都是不存在的。补码的编码规则如下:十进制数字 0,其补码就是:0000 0000。-1,就是“零减一”,即:0000 0000-1。用二进制减法计算,可得:(1) 1111 1111。机器数,只有 8 位,即:...

二进制的原码、补码、反码详解
用补码的计算过程如下:7 的补码=0000 0111 -3的补码=1111 1101 --相加--- 得:(1) 0000 0100 = 4 的补码 舍弃进位,只保留八位,作为结果即可。这就是:使用补码,加法就代替了减法。所以,在计算机中,有一个加法器,就够用了。原码和反码,都没有这种功能。--- 原码和反码,毫...

二进制的余码,反码,补码怎么算?
举例说明如下:真值X = -11111 , 若字长8位,则:[X]原 =10011111 , 最高位是符号位,1表示负数[X]反 =11100000 , 将原码除符号位之外的数值位取反得反码[X]补 =11100001 ,将反码末位加1得补码若真值是正数,无须上述操作,正数的原码反码补码符号位为0,数值与真值相同例如,真值 y = ...

原码,补码,反码都是什么意思,怎么算啊
2的补码:00000010 也就是,正数的原码,反码,补码都相同 下面是负数的原码、反码、和补码:3的原码:00000011 -3的原码:10000011 也就是最左边的那个数表示正负,0代表正,1代表负,它也叫符号位 -3的原码:10000011 -3的反码:11111100 负数的反码是对其原码按位取反,符号位不变 -3的补...

二进制正,负数的原码,反码,补码三者之间是什么关系
(3)列出 的8位二进制原码,反码和补码并将补码用十六进制表示。内容拓展:一、二进制 1、是计算技术中广泛采用的一种数制。二进制数据是用0和1两个数码来表示的数。它的基数为2,进位规则是“逢二进一”,借位规则是“借一当二”,由18世纪德国数理哲学大师莱布尼兹发现。2、当前的计算机系统使用...

二进制数+1011的原码、反码、补码分别是什么?(还有-1101和-101010)
+1011的原码是001011,反码是010100,补码是010101。-1101的原码是00010B,反码是01101B,补码是00010B。-10101的原码是10000010B,反码是11111101B,补码是11111110B。

原码补码反码
用16bit表示,三个码分别是:原码、反码、补码 -0: 1000 0000 0000 0000、1111 1111 1111 1111、0000 0000 0000 0000 -6875: 1001 1010 1101 1011、1110 0101 0010 0100、1110 0101 0010 0101 -11: 1000 0000 0000 1011、1111 1111 1111 0100、1111 1111 1111 0101 如果是8位,:原码...

北塔区18092215913: 一个数的原码,反码,补码怎么算啊? -
权赖樟脑:[答案] 数在计算机中是以二进制形式表示的. 数分为有符号数和无符号数. 原码、反码、补码都是有符号定点数的表示方法. 一个有符号定点数的最高位为符号位,0是正,1是副. 以下都以8位整数为例, 原码就是这个数本身的二进制形...

北塔区18092215913: 原码,反码和补码之间有怎样的计算关系? -
权赖樟脑:[答案] 原码 正数的符号位为0,负数的符号位为1,其它位按照一般的方法来表示数的绝对值.用这样的表示方法得到的就是数的原码. 反码 对于一个带符号的数来说,正数的反码与其原码相同,负数的反码为其原码除符号位以外的各位按位取反. 补码 正数的...

北塔区18092215913: 原码,反码和补码表示的规则分别是什么 -
权赖樟脑: 数在计算机中是以二进制形式表示的. 数分为有符号数和无符号数. 原码、反码、补码都是有符号定点数的表示方法. 一个有符号定点数的最高位为符号位,0是正,1是副. 以下都以8位整数为例, 原码就是这个数本身的二进制形式. 例如 ...

北塔区18092215913: 原码,补码,反码,移码的表示方法怎么算? -
权赖樟脑: 原码就是把原来的数化成2进制 比如10的原码就是00001010,+10的原码是00001010,最高位的0代表 这个数是正数(最高位就是符号位). -10的原码就是10001010,最高位的1代表这个数是负数 +10的原码是00001010,那他的反码,补码都和原码相同 也是00001010,原因是正数的原 反 补码相同 -10的原码是10001010,那他的反码是11110101,也就是符号位不变,其他位0变1,1变0. 他的补码是在反码的基础上,最低位加1,也就是11110110. 明白了吧?

北塔区18092215913: 怎么计算( - 18)+的原码,补码和反码? -
权赖樟脑: 这个看按多少位来算了,不管按多少位,首位为符号位. 如按8位: 原码:1001 0010 (符号位为1,数值与整数原码相同) 反码:1110 1101 (符号位不变,数值按位取反) 补码:1110 1110 (在反码基础上末位加1) 按16位: 原码:1000 0000 0001 0010 反码:1111 1111 1110 1101 补码: 1111 1111 1110 1110 按32位雷同.

北塔区18092215913: 原码 反码 补码 计算 -
权赖樟脑: 正数:正数的反码与原码相同. 负数:负数的反码,符号位为“1”,数值部分按位取反. 例如: 符号位 数值位 [+7]反= 0 0000111 B [-7]反= 1 1111000 B 所以楼主再仔细看一下书,究竟00011010是+26的反码,还是负数的反码 --------------------...

北塔区18092215913: 和计算机有关的,反码,原码,补码!求它们的计算方法!望各位指教! -
权赖樟脑: 原码就是一个n位二进制数,例如11110000B 反码把原码按位取反,00001111B 补码把反码加一,产生的最高位进位舍弃,00010000B 补码就是把反码加1 ,就可以了 反码0101010B的补码是0101011B

北塔区18092215913: 怎么样计算补码的反码 -
权赖樟脑: 一般原码将1变0,0变1就成为反码,而补码在反码基础上加一, 要求补码的反码直接减一就行了.

北塔区18092215913: 真值与码值有何区别?原码、反码、补码三者之间如何换算? -
权赖樟脑: 如果原码00000 反码就是11111 补码是反码(正数)反码+1(负数) 真值是一个变量本身所具有的真实值 码值就是个表

北塔区18092215913: 如何理解二进制原码,反码,补码,二进制补码运算 -
权赖樟脑: 1.基础概念和计算方法 在探求为何机器要使用补码之前, 让我们先了解原码, 反码和补码的概念.对于一个数, 计算机要使用一定的编码方式进行存储. 原码, 反码, 补码是机器存储一个具体数字的编码方式.http://blog.csdn.net/yinyhy/article/details/8732118

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网