原码反码补码
说到二进制补码,大家都知道:有符号数的负数的补码是 其正数的反码+1,例如 10001111 的补码是反码01110000 加 1 =01110001 ,很多书都这么说,可是为什么这样计算的结果就是它的补码?为什么要用补码?很多书要么不解释,要么就是说:这是因为在计算机内补码计算最快。(其实是补码计算指令的CPU设计更容易实现) 最初我看的书,《大学计算机基础教程》(我非计算机专业),这破书说不清,道不明,给与我非常严重负面的影响,以至于我在以后的计算机学习过程中,程序设计中遇到大大小小不少麻烦和迷茫。
在某些计算机组成原理书上提到:其实补码的计算原理,是用一个模来减去无符号的正数部分。譬如时钟,12点之后是13点,但是时钟上没有13点怎么办?就用13减去12=1点。这个模是12.可惜这个比喻并不是很好。
请看 一个字节长的无符号数的表示范围 :0~255,有符号数的表示范围:-128~127 , 注意,这个表示范围的写法极有可能影响我们的思维,从而导致错误。我们应该这样来写:0~127 ~ -128 ~ -1 ,这才是较好的写法。为什么?因为这个写法的数的顺序与0~255 一一对应。
由上,我们了解,其实补码不过是用128 ~ 255 这段范围的数来表示 ~128 ~ -1这段范围的负数。那么我们就可以凭自己,而不是看教材,就可以推测出计算补码的公式,就是:256-欲求的负数的绝对值= 此负数的补码。
没错,就是这么简单的东西,可是却困扰了很多人。可见有个好的教材是多么的重要。
至于前面 “负数的补码是 其正数的反码+1” , 极为垃圾的教材才会把这个计算方法作为初始方法来教。因为这个计算方法屏蔽了补码的计算原理。其实这不过是 “256 - 欲求的负数的绝对值 = 此负数的补码”的一个比较取巧的计算方法而已。请看 256=1 0000 0000 =1111 1111+1,而 1111 1111减任何二进制数的结果就是把这个数取反,那么 256 - 某二进制数A 既是:将 A取反 +1
以上:完毕!
注:所有讨论均在字节长范围内(8bit) 进行
无论什么类型的数字,在计算机中,都是以“二进制代码”存储的。
实用的,只是补码。
而原码和反码,在计算机中,并不存在。
因为,原码反码的定义,都是不合理的,不适于计算。
下面按照八位二进制来说明补码的定义,其它位数,自行脑补。
十进制数 0,存放的,就是二进制 0000 0000。
十进制数 +1,就加上 1,二进制是 0000 0001。
十进制数 +2,就再加 1,二进制是 0000 0010。
。。。
十进制数 +127,加 1加 1...,就加到了 0111 1111。
+127,这就是最大数值。
----------
负数怎么办? 你就从 0,依次递减吧。
十进制数 0,以二进制 0000 0000 存放。
十进制数 -1,就减去 1,得 1111 1111 = 255(十进制)。
十进制数 -2,就再减 1,得 1111 1110 = 254。
十进制数 -3,就再减 1,得 1111 1101 = 253。
。。。
十进制数 -128,减 1减 1...,得 1000 0000 = 128。
不要再减了,这就是最小值了。
(你再继续减,就是 0111 1111,这就是+127 了。)
因此,最小数值就是-128。
----------
总结:
零和正数:直接用二进制存放。
负数:存放形式是【256+这个负数】。
这套存放格式,就是所谓的【补码】。
求【补码】,就是这么简单。
完全不用绕到“原码反码符号位”那么远。
可以用十进制来计算。如果需要二进制,你就再转换一下。
用这个方法,不涉及原码反码符号位,就少了不少麻烦事。
----------
为什么负数用补码存储?
利用补码,可以把减法运算,转换成加法。
(所以,在计算机中,有一个加法器,就够用了。)
例如,6-2 = 4,在计算机中用补码代替数字,运算如下:
6 的补码是 0000 0110
+ -2 的补码是 1111 1110
-----------------
(1) 0000 0100 (= 4 的补码)
(括号中的 1,是进位,舍弃不要了。)
注意:
如果运算结果超出了-128~+127 的范围,结果将是错的。
这种现象称为“溢出”。
再注意一下:进位,并不等于溢出。
---------
因为补码的这个特性,所以,在计算机中,只是使用补码存放数据。
而原码反码,在计算机中,都是不存在的。
原码反码 的用途,仅仅是用于“心算、笔算”。
其实,笔算的方法,并非只有“取反加一”。
另外,-128,有补码,但是却没有原码反码!
用“取反加一”来求-128 的补码,无异于缘木求鱼。
所以,大家,完全不必在原码反码 上浪费时间精力。
但是,考试怎么办?
呃 ...,还是别跟老师较劲,他怎么乱讲,你就怎么答吧。
(1)原码表示法
原码表示法是机器数的一种简单的表示法。其符号位用0表示正号,用:表示负号,数值一般用二进制形式表示。设有一数为x,则原码表示可记作[x]原。
例如,X1= +1010110
X2= 一1001010
其原码记作:
[X1]原=[+1010110]原=01010110
[X2]原=[-1001010]原=11001010
原码表示数的范围与二进制位数有关。当用8位二进制来表示小数原码时,其表示范围:
最大值为0.1111111,其真值约为(0.99)10
最小值为1.1111111,其真值约为(一0.99)10
当用8位二进制来表示整数原码时,其表示范围:
最大值为01111111,其真值为(127)10
最小值为11111111,其真值为(-127)10
在原码表示法中,对0有两种表示形式:
[+0]原=00000000
[-0] 原=10000000
(2)补码表示法
机器数的补码可由原码得到。如果机器数是正数,则该机器数的补码与原码一样;如果机器数是负数,则该机器数的补码是对它的原码(除符号位外)各位取反,并在未位加1而得到的。设有一数X,则X的补码表示记作[X]补。
例如,[X1]=+1010110
[X2]= 一1001010
[X1]原=01010110
[X1]补=01010110
即 [X1]原=[X1]补=01010110
[X2] 原= 11001010
[X2] 补=10110101+1=10110110
补码表示数的范围与二进制位数有关。当采用8位二进制表示时,小数补码的表示范围:
最大为0.1111111,其真值为(0.99)10
最小为1.0000000,其真值为(一1)10
采用8位二进制表示时,整数补码的表示范围:
最大为01111111,其真值为(127)10
最小为10000000,其真值为(一128)10
在补码表示法中,0只有一种表示形式:
[+0]补=00000000
[+0]补=11111111+1=00000000(由于受设备字长的限制,最后的进位丢失)
所以有[+0]补=[+0]补=00000000
(3)反码表示法
机器数的反码可由原码得到。如果机器数是正数,则该机器数的反码与原码一样;如果机器数是负数,则该机器数的反码是对它的原码(符号位除外)各位取反而得到的。设有一数X,则X的反码表示记作[X]反。
例如:X1= +1010110
X2= 一1001010
[X1]原=01010110
[X1]反=[X1]原=01010110
[X2]原=11001010
[X2]反=10110101
反码通常作为求补过程的中间形式,即在一个负数的反码的未位上加1,就得到了该负数的补码。
例1. 已知[X]原=10011010,求[X]补。
分析如下:
由[X]原求[X]补的原则是:若机器数为正数,则[X]原=[X]补;若机器数为负数,则该机器数的补码可对它的原码(符号位除外)所有位求反,再在未位加1而得到。现给定的机器数为负数,故有[X]补=[X]原十1,即
[X]原=10011010
[X]反=11100101
十) 1
[X]补=11100110
例2. 已知[X]补=11100110,求[X]原。
分析如下:
对于机器数为正数,则[X]原=[X]补
对于机器数为负数,则有[X]原=[[X]补]补
现给定的为负数,故有:
[X]补=11100110
[[X]补]反=10011001
十) 1
[[X]补]补=10011010=[X]原
mov 只是简单的储存,单看数据本身,无法判断一个二进制数有没有符号,是用补码、反码、还是原码,甚至是否代表一个数字。那些都是编程的人为数据赋予的意义。如果有大段程序,可以看出逻辑、算法,也许可以辨别。
一般来说,表达负整数,目前只有用“补码”一个方法。“反码”和“原码”纯属历史,微处理器年代已经不用了。至于改二进制数有没有符号,就要从程序的上下文找线索了。有些指令是分有符号和无符号的,如果出现了,就比较好判断。以 8086 指令集为例:
乘
除
右移
无符号
mul
div
shr
有符号
imul
idiv
sar
反码是把数字“按位取反”最高位不变如“100000”=“111111”补码是反码加“1”如“1000000”=“1000001”
原码反码补码是什么意思
原码、反码和补码的意思如下:原码、反码和补码是计算机中用来表示有符号整数的编码方式。它们在数字的表示方法和运算中有着不同的意义和作用。1.原码(Sign-Magnitude):原码是最简单的表示方法,即将一个数的绝对值转换为二进制,然后用符号位表示正负。符号位为0表示正数,符号位为1表示负数。例如:+...
原码、反码、补码
反码通常作为求补过程的中间形式,即在一个负数的反码的未位上加1,就得到了该负数的补码。例1. 已知[X]原=10011010,求[X]补。分析如下:由[X]原求[X]补的原则是:若机器数为正数,则[X]原=[X]补;若机器数为负数,则该机器数的补码可对它的原码(符号位除外)所有位求反,再在未位加1而得到。现给定的机...
反码、补码、原码是什么意思?怎么换算?
反码补码原码怎么转换,来看看方法吧。1、首先原始代码的最高位是符号位,0表示正,1表示负,中间值表示数字的绝对值。2、符号的反转,正数符号的反转与原符号相同,负数的补数是该符号的最低有效位数加上1。3、补数,正数的补数与原代码相同,负数的补数在其倒数第一的基础上加1。零分为+0和-0。
反码补码原码是什么意思
反码是在原码的基础上进一步改进,反码是正数和负数的一种特殊的二进制表示方法,正数的反码与其原码相同,负数的反码则是将原码中所有的1变为0,0变为1。3、补码 补码是计算机中最常用的二进制表示方法。正数的补码与其原码相同,而负数的补码则是将反码加1。负数通常是以补码的形式来表示的,补码的引...
原码、补码、反码之间是怎样转换的?
具体操作如下:-正整数:原码、反码和补码都相同,无需转换。-负整数:首先计算原码,然后将原码的除符号位外的所有位取反得到反码,最后在反码的最低位加1得到补码。补码的表示方法与模运算有关。例如,计算机的运算通常基于字长的模,如8位字长对应256的模。对于负数,其补码实际上是在正数的基础上加...
原码、反码、补码都是8位的吗?999的原码反码补码是多少?
1、原码、反码、补码主要看他的字型数据,如果字节型数据,占8位,那么它的原码、反码、补码都是8位。如果字型数据,占16位,那么它的原码、反码、补码都是16位。2、999必须要给定其数据类型,才能确定其原码、反码、补码。字节型数据只有8位,原码是0000 0011 1110 0111。反码是1111 1100 0001 ...
原码反码和补码有什么区别?
原码就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值。正数的反码是其本身,负数的反码是在其原码的基础上, 符号位不变,其余各个位取反。正数的补码就是其本身,负数的补码是在其原码的基础上符号位不变,其余各位取反, 最后+1(即在反码的基础上+1)。正数的原码,反码,补码都...
原码反码补码是多少
+35:原码=反码=补码=0100011 -35:原码:1100011;反码:1011100;补码:1011101;
计算机中的原码,补码,反码是什么意思?
计算机中的原码、反码和补码是表示有符号整数的不同方式,用于在计算机中进行整数运算和表示负数。以下是它们的定义和示例:原码(Sign-Magnitude):原码的表示方式最简单,将整数分为两部分:符号位和数值位。符号位用于表示正数或负数,0表示正数,1表示负数。数值位表示整数的绝对值。例如,十进制数 -5...
什么是原码 补码 反码
有符号数,有三种表示方法,即原码、反码和补码。在计算机系统中,数值一律用补码来表示和存储。在计算机系统中,原码和反码,都是不存在的。=== 数值 0,在八位机中,就是 0000 0000。+1,就是加上一,即为:0000 0001。+2,就再加上一,即为:0000 0010。其他正数,依次递增即可。。。
诸服蟾酥:[答案] 原码: 在数值前直接加一符号位的表示法.对于8位二进制来说: [+7]原= 0 0000111 [-7]原= 1 0000111 反码: 正数的反码与原码相同. 负数的反码,符号位为“1”,数值部分按位取反. [+7]反= 0 0000111 [-7]反= 1 1111000 补码: 正数的补码和原码...
凤山县15322886400: 原码,反码和补码之间有怎样的计算关系? - ?
诸服蟾酥:[答案] 原码 正数的符号位为0,负数的符号位为1,其它位按照一般的方法来表示数的绝对值.用这样的表示方法得到的就是数的原码. 反码 对于一个带符号的数来说,正数的反码与其原码相同,负数的反码为其原码除符号位以外的各位按位取反. 补码 正数的...
凤山县15322886400: 原码、反码、补码之间的关系 - ?
诸服蟾酥:[答案] 给你举个例子吧:二进制,原码(101011),反码(010100),反码是相对与原码而言的,逐位取反;十进制,原码6,补码4,补码和进制相关,6+4=10,所以说4和6互为补码
凤山县15322886400: 原码,反码,补码是什么?例如:78的二进制数是01001110.那它的原码,补码,反码各是什么? - ?
诸服蟾酥:[答案] 正数的原码,补码,反码相同,先求原码,因为正数的原码就是他的真值. 负数的原码是在正数的原码基础上,最高位置1,即符号位.然后再求反码:符号位1不变,后面的所有位取反,然后再求补码:在反码的基础上,末尾加1 .注意负数的反码,补...
凤山县15322886400: 什么是原码、反码、补码? - ?
诸服蟾酥: 1、原码的定义 原码表示法是机器数的一种简单的表示法.其符号位用0表示正号,用:表示负号,数值一般用二进制形式表示.设有一数为x,则原码表示可记作[x]原. ①小数原码的定义 [X]原 = X 0≤X
凤山县15322886400: 什么是原码,补码和反码 - ?
诸服蟾酥: 原码就是题目给你的010011001这种二进制码,反码就是把原码的0变1,1变0,如101100110,补码就是反码加1,就是101100111我觉得很通俗了
凤山县15322886400: 整数的原码,反码和补码的表示? - ?
诸服蟾酥:[答案] 原码表示:将符号位数码化了的数,其中“+”用0表示,“-”用1表示.反码表示:正数的反码表示与原码表示一样;负数的反码表示是原码表示的符号位不变,数值位逐位取反.补码表示:正数的补码表示与原码表示一样;负数的...
凤山县15322886400: 原码、补码和反码的概念? - ?
诸服蟾酥:[答案] 数在计算机中是以二进制形式表示的. 数分为有符号数和无符号数. 原码、反码、补码都是有符号定点数的表示方法. 一个有符号定点数的最高位为符号位,0是正,1是副. 以下都以8位整数为例, 原码就是这个数本身的二进制形...
凤山县15322886400: 原码,反码,补码怎么解释 - ?
诸服蟾酥: 将10进制数转换成2进制数,称为原码,原码各位取反称为反码,反码最低位+1,称为补码. 这些主要是为了表示负数,才有了这些概念.
凤山县15322886400: 原码、反码、补码,计算机中负数的表示? - ?
诸服蟾酥:[答案] 一:对于正数,原码和反码,补码都是一样的,都是正数本身. 对于负数,原码是符号位为1,数值部分取X绝对值的二进制. 反码是符号位为1,其它位是原码取反. 补码是符号位为1,其它位是原码取反,未位加1. 也就是说,负数的补码是其反码未位...