-
补码的表示范围_原码,补码,反码详解
2020-12-08 05:30:22并且进行了深入探求了为何要使用反码和补码, 以及更进一步的论证了为何可以用反码, 补码的加法计算原码的减法.。一. 机器数和真值在学习原码, 反码和补码之前, 需要先了解机器数和真值的概念.1、机器数一个数在...今天由传智播客老师给大家讲解计算机的原码, 反码和补码. 并且进行了深入探求了为何要使用反码和补码, 以及更进一步的论证了为何可以用反码, 补码的加法计算原码的减法.。
一. 机器数和真值
在学习原码, 反码和补码之前, 需要先了解机器数和真值的概念.
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](原码) = 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] 因为第一位表示的是符号位.而使用补码表示时又可以多保存一个最小值.
-
原码、反码和补码的表示范围
2017-01-03 14:32:09首先形成的概念是:原码和反码小数表示的范围是一样的,仅仅是二进制的存储不同罢了。 更有趣的是它们的存储范围是关于零点对称的! 原码小数,反码小数都是:−1+2−n=x=1−2−n 中间是+0,−0两种 x0x1x2x3…...小数: x0.x1x2x3…xn,其中x0是符号位
整数:x0x1x2x3…xn,其中x0是符号位首先形成的概念是:原码和反码小数表示的范围是一样的,仅仅是二进制的存储不同罢了。
更有趣的是它们的存储范围是关于零点对称的!
原码小数,反码小数都是:−1+2−n=<x<=1−2−n
中间是+0,−0两种
x0x1x2x3…xn
原码整数,反码整数:−(2n−1)≤x≤2n−1//这个很好理解,例证是-127~127
补码里的0只有一种表示,因此多了一个离散状态可以表示其他的数,这个数在小数中是−1,整数中是−2n
所以把数据给了最小的那个。
自然而然就不是对称的。因此补码小数:−1≤x≤1−2−n
补码整数:−2n≤x≤2n−1
总结一下三种表示方法的范围:
定点小数:
原码: -(1-2-n) ≤ N ≤ 1-2-n
反码: -(1-2-n) ≤ N ≤ 1-2-n
补码: -1 ≤ N ≤ 1-2-n
定点整数:
原码: -(2n -1) ≤ N ≤ 2n -1
反码: -(2n -1) ≤ N ≤ 2n -1
补码: - 2n ≤ N ≤ 2n -1
-
补码的表示范围_计算机的原码、反码和补码
2020-12-03 12:11:51原码就是整数绝对值的二进制形式,为了解决计算机中有负数的运算,提出了反码、补码。1、原码原码就是符号位加上真值的绝对值,第一位表示符号,其余位表示值。对于4位的二进制,其取值范围就是[1000,0111],即[-8...数据在计算机里面都是以0和1存储和运算的,这是冯诺依曼体系的基础。
比如一个数在计算机中若有正负之分,则用一个数的最高位(符号位)用来表示它的正负,其中0表示正数,1表示负数。
原码就是整数绝对值的二进制形式,为了解决计算机中有负数的运算,提出了反码、补码。
1、原码
原码就是符号位加上真值的绝对值,第一位表示符号,其余位表示值。对于4位的二进制,其取值范围就是[1000,0111],即[-8,7]。
+5的原码:0101
-5的原码:1101
2、反码
正数的反码是其本身。
负数的反码是在其原码的基础上,符号位不变,其余位取反。
+5的反码:0101
-5的反码:1010
可见如果一个反码表示的是负数,是无法直观地看出来它的数值,通常要将其先转换成原码再计算。
3、补码
正数的补码还是其本身。
负数的补码是在其原码的基础上,符号位保持不变,其余位取反,最后+1。即反码加1。
+5的补码:0101
-5的补码:1011
综上,计算机有三种编码方式来表示同一个数。
对于+5和-5,
[+5] = [0101]原 = [0101]反 = [0101]补
[-5] = [1101]原 = [1010]反 = [1011]补
计算机采用补码的形式来表示负数。欲知为何如此,请阅读计算机为何采用补码的形式来表示负数
相关阅读
十进制小数如何转换为二进制
计算机为什么用二进制和十六进制
-
补码的表示范围_C/C++学习日记:原码、反码和补码
2020-11-14 00:25:57一、什么是原码、反码和补码我们知道,在计算机内部存储的带符号数都是以补码形式存储,用补码形式进行运算的。什么是一个数的补码?为什么要用补码?这要从数的原码、反码开始讲。我们以整型数为例,且假定字长为8位。1...一、什么是原码、反码和补码
我们知道,在计算机内部存储的带符号数都是以补码形式存储,用补码形式进行运算的。什么是一个数的补码?为什么要用补码?这要从数的原码、反码开始讲。我们以整型数为例,且假定字长为8位。
1、原码
整数X的原码是指:其符号位为0表示正,为1表示负;其数值部分就是X的绝对值的二进制数。X的原码通常用【X】原表示。如:
【+100】原=01100100 【+0】原=00000000
【-100】原=11100100 【-0】原=10000000
注意:在原码中,零有两种表示形式。
原码表示法简单易懂,与真值(带符号数本身)转换方便,只要符号还原即可,但当两个正数相减或不同符号数相加时,必须比较两个数哪个绝对值大,才能决定谁减谁,才能确定结果是正还是负,所以原码不便于加减运算。
2、反码
X的反码是指:对于正数,反码与原码相同;对于负数,符号位不变,其数值位X的绝对值取反(1变0,0变1)。X的反码通常用【X】反来表示。如
【+100】反=01100100 【+0】反=00000000
【-100】反=10011011【-0】反=11111111
注意:在反码中,零也有两种表示形式。
反码运算也不方便,通常用来作为求补码的中间过渡。
3、补码
X的补码是指:对于正数,补码与原码相同;对于负数,符号位不变,其数值位X的绝对值取反后在最低位加1。X的补码通常用【X】补来表示,实际上,【X】补=【X】反+1。如:
【+100】补=01100100 【+0】补=00000000
【-100】补=10011100 【-0】补=00000000
注意:在补码中,零有唯一的编码,【+0】补=【-0】补=00000000。
补码运算简单方便,符号位可以作为数据的一位参与运算,不必单独处理;二进制的减法可用其补码的加法来实现,简化了硬件电路。
二、补码的意义
首先,我们来看几个例子。
【例子1】用8位二进制数分别表示+0和-0 。
解:我们知道,对于有符号数,我们规定最高位为符号位,0表示正数,1表示负数。剩余位为数值位,用来表示数的大小。
所以+0就表示为0000 0000,而-0表示为1000 0000。
【例子2】计算9-6的结果。
解:我们知道:9-6=9+(-6)=3
0000 1001
+1000 0110
1000 1111
结果为-15,明显不对。
而如果我们采用补码来进行计算呢?
我们知道,9的补码是0000 1001,-6的补码是11111010,重新进行运算,
0000 1001
+1111 1010
1 0000 0011
最高位的1溢出,剩余8位二进制表示的是3的补码。结果为3,正确。
【例子3】分析程序运行结果。
main()
{int a=100,b=-1;
Printf(“a=%d,%x,%o,%u”,a,a,a,a);
Printf(“b=%d,%x,%o,%u”,b,b,b,b);}
运行结果:
a=100,64,144,100
b=-1,ffff,177777,65535
【例子1】中,为什么同样一个0有两种不同的表示方法呢?
【例子2】中,为什么第一种计算方法会错,而用补码计算结果才对呢?
而【例子3】中,为什么-1以十六进制、八进制以及无符号整型输出的结果分别变成了ffff,177777,65535?
这是因为在计算机系统中,数值一律用补码来表示(存储)。
主要原因:
1、统一了零的编码;
2、将符号位和其它数值位统一处理;
3、将减法运算转变为加法运算;
4、两个用补码表示的数相加时,如果最高位(符号位)有进位,则进位被舍弃。
三、补码的计算
1、定义法:
(1)正数的补码:与原码相同。
【例1】+9的补码是00001001。
(2)负数的补码:符号位为1,其余位为该数绝对值的原码按位取反;然后整个数加1。
【例2】求-9的补码。
因为给定数是负数,则符号位为“1”。
后七位:+9的原码(0001001)→按位取反(1110110)→加1(1110111)
所以-7的补码是11110111。
2、查零法
原码是用1来表示数值的大小,属于正逻辑,对原码的计算我们主要是计算1的个数;而反码和补码是用0来表示数值的大小,属于负逻辑,所以我们可以采取 逆向逻辑思维来理解,通过计算0的个数来求负数的补码。由于补码是在反码的基础上加了一个1,所以0的个数应该比原数的绝对值小1。
例如:求-5的补码
零的个数应为4个,所以-5的补码为:11111011。
再如:求-97的补码
零的个数应为96个,96=64+32,对应的权值位为0,其余位为1。所以-97的补码为:10011111。
3、零减法
负数的补码=全零-正数的原码,如-5的补码=0-5的原码。
用该数的十六进制计算,得到的结果转换为二进制即可。
例如:求-5的补码
算法1:算法2:
00000000 00H
﹣00000101 ﹣05H
11111011 0 FBH
4、找1法
例如:求-15的补码
第一步:+15:00001111
第二步:从右向左找到第一个1,然后把左边的所有位取反。
11110001
再举一个例子验证下:求-64的补码
+64:01000000
11000000
四、几点补充
1、已知一个数的补码,求原码的操作分两种情况:
(1)如果补码的符号位为“0”,表示是一个正数,其原码就是补码。
(2)如果补码的符号位为“1”,表示是一个负数,那么求给定的这个补码的补码就是要求的原码。
【例3】已知一个补码为11111001,则原码是10000111(-7)。
因为符号位为“1”,表示是一个负数,所以该位不变,仍为“1”。
其余七位1111001取反后为0000110;
再加1,所以是10000111。
2、数值范围
8位二进制原码所表示数的范围是-127~+127;
五、总结:
1、原码表示法
除了符号位外,其他二进制位为数值的绝对值,这种方案称为“原码”表示法。例如:
+20的原码:0 000 0000 0001 0100
-20的原码: 1 000 0000 0001 0100
2、反码表示法
除了符号为以外,负数的反码表示是在原码的基础上其他二进制取反,而正数的反码表示与原码相同。如:
+20的反码为: 0 000 0000 0001 0100
-20的反码为: 1 111 1111 1110 1011
3、补码表示法
负数的补码表示是在反码基础上加1,而正数的反码表示与原码相同。
4、为什么计算机一般采用补码表示法
原码、反码和补码是由于表示负数的三种方案,三种方案中,原码最适合与乘除类运算,补码适合于加减类运算,而反码则加减与乘除都不是很理想,由于加减运算的频率远高于乘除运算,所以多数计算机系统采用的是补码方案。所以所有计算机的加减运算都要将相应的数转换成补码,然后再进行运算。
-
原码 反码 补码 移码 浮点数的范围和精度
2020-04-16 19:49:26对于反码和补码,要区别:已知[x补],求[-x补]的题目(连同符号位各位取反,末位加一)。 原码:1001101 反码:1,110010(除符号位以外,各位取反) 补码:1,110011(除符号位以外,各位取反,末位加一) ... -
原码、反码和补码的关系以及表示范围
2019-09-16 22:35:488位二进制补码的表示范围:-128~+127 实际上,将负数用补码表示,实际上是实现了一种从[-128, 127]到[0, 255]的映射。 原码、补码、反码的关系 原码、反码和补码—— -128的补码为什么是10000000 ... -
补码的表示范围_原码,反码,补码
2020-12-13 15:30:56这里就要涉及到原码,反码,补码的概念。首先我们先来了解一下它们的概念:原码(true form)是一种计算机中对数字的二进制定点表示方法。原码表示法在数值前面增加了一位符号位(即最高位为符号位):正数该位为0,负数... -
原码,反码,补码的表示范围总结
2016-09-15 15:37:01首先形成的概念是:原码和反码小数表示的范围是一样的,仅仅是二进制的存储不同罢了。 更有趣的是它们的存储范围是关于零点对称的!原码小数,反码小数都是:-1+2^(-n) =^(-n) 中间是+0,-0两种 x0x1x2x3…xn ... -
数据的表示之原码,补码,反码和移码
2020-08-03 00:09:24为何还会有反码和补码呢? 四、数值表示范围 五、原码反码补码再深入 一、机器数和真值 在学习原码反码,补码和移码之前需要先了解机器数和真值的概念。 1、机器数 一个数在计算机中的二进制表示形式,叫做... -
原码 反码 补码 数据类型的表示范围(例如byte型为什么是-128~127)
2020-09-07 23:46:59最近复习c++,发现原码反码补码以及有符号数和无符号数的表示范围这方面的概念很模糊,现整理如下,供大家参考。 1、原码: 最高位表示数的符号,其他位表示数值 例如:[+7]原 = 0000 0111 [-7]原 = 1000 0111 2、... -
原码反码补码、左移右移和数值类型的范围
2017-05-15 10:38:38关于左移和右移: 逻辑左移和算数右移结果...原码反码和补码以char型为例,有符号(负数char)在计算机中的存储方式是补码形式:char x = -3; 则 x 的原码: 10000011 反码: 11111100 补码: 11111101 x表示x左移一 -
原码,补码,c中各类型表示的范围
2011-12-09 10:26:44相信大家都了解原码和补码的转换关系,若不知道百度一下很多解释的.我主要想阐述下其中在编译器(VC6.0)和内存中得分布情况. 首先计算机所有数字存储都是通过原码的形式,这样只用加法就解决了减法的问题. 在c或者c++... -
整数的补码怎么表示_计算机组成原理小课堂(4)——原码,补码,反码,移码...
2020-11-29 21:11:25记住了这个图,这一部分就不用担心了~那下面咱们分别回忆一下原码,补码,反码和移码吧~(以下字长都为n+1)原码:最高位为符号位,用“0”表示正号,“l”表示负号,有效值部分用二进制的绝对值表示。则定点整数表... -
浮点数的表示范围及原码补码
2019-02-19 19:41:02一般来说,类型float和double分别有7和16个有效位。 ... 为什么8位有符号类型的...符号位代表整个数字的符号,指数第一位代表指数的符号,后7位代表范围,因此float表示的范围是-*1 ~+*1 即 -127~128 1(23位小... -
C语言算出原码、补码和反码
2015-10-28 17:58:43算出来的原码、补码和反码都是8进制的。...//则X真值的表示范围为-127~+127, //用补码表示的数,比原码多了一个数, //-128~+127。比如,-128用原码和反码无法表示 //,用补码表示为10000000.主要 -
C++ 原码、补码和反码解析
2017-04-15 09:42:05首先对于有符号数,第一位的位置是表示的正负,为1时是负数,为0时是正数 其次,正数的原码、补码、反码一致 负数的反码是原码的数值位(也就是除了第一...无论32位还是64位,int都是4个字节,32位,表示的范围为-2147 -
原码反码补码移码的目的
2020-05-04 15:32:03唐朔飞那本教材太高估我的智商,上来就是小数的,补码的全是抽象的计算,都不给几个例子(这,给初学者的教材?)…… 我们先用8位二进制数来表示数值 真值 原码 补码(负数时,反码+1) 反码(负数时,原码... -
原码反码补码详析及移位
2020-03-16 11:18:07文章目录原码、反码和补码的详析 及 移位一、原码、反码和补码的定义与 表现形式1.原码2.反码3.补码4.用表格总结,便于记忆!!二、为何使用原码、补码和反码1.原码的加法2.反码的加法(循环进位)3.补码的加法... -
原码反码补码
2020-08-17 21:58:321. 原码 原码就是符号位加上真值的绝对值, 即用第一位表示符号, ...原码是人脑最容易理解和计算的表示方式. 2. 反码 反码的表示方法是: 正数的反码是其本身 负数的反码是在其原码的基础上, 符号位不变,其余各个.. -
原码、补码、反码的作用和区别
2018-07-26 18:12:45概念介绍: 计算机中的信息都是以二进制形式表示的,数值有正负之...有了数值的表示方法就可以对数进行算术运算。但是很快就发现用带符号位的原码进行乘除运算时结果正确,而在加减运算的时候就出现了问题,如下(假... -
补码的表示范围_计算机为何采用补码的形式来表示负数
2020-12-13 15:30:18从上文:计算机的原码、反码和补码可知,计算机有三种编码方式来表示同一个数:原码:符号位加上真值的绝对值,第一位表示符号,其余位表示值。反码:正数的反码是其本身;负数的反码是在其原码的基础上,符号位不变... -
原码、补码和反码
2011-06-12 19:14:00原码表示法是机器数的一种简单的表示法。其符号位用0表示正号,用:表示负号,数值一般用二进制形式表示。设有一数为x,则原码表示可记作[x]原。...当用8位二进制来表示小数原码时,其表示范围:最大值为0. -
如何求原码、补码、反码、移码和他们的关系
2017-01-01 21:49:50整数补码的表示范围是:-128~+127 整数反码的表示范围是:-127~+127 当x=+1110, [x]原=0,1110正数符号位是0 当x=-1110, [x]原=1,1110 负数符号位是1 当x=+1010,[x]补=0,1010 正数补码是本身 当x=-1101, [x] -
计算机原码、补码、反码
2020-10-30 21:24:37数字在机器中的表示有以下几种:原码、补码、反码 字节:8位 字长:若干个字节,到底是几个字节,具体看是哪种CPU 好处:通俗理解,解决了-0的问题 原码、补码、反码就是为了负数准备的,正数三种码一模一样 原码:...