原码补码和反码的具体定义
- 格式:docx
- 大小:13.79 KB
- 文档页数:4
计算机原理- 整数的补码,原码, 反码解释一:对于整数来讲其二进制表示没有符号位.一个字节的表示范围为00000000-11111111,由此可见一个字节的整数表示范围为[0,255=2^8 - 1]。
对于整数来讲,其二进制表示中存在一个符号位.先来看一下下面几个定义:1:在计算机中,负数以其正值的补码形式表达。
正数即在符号位补0.2:原码:一个整数,按照绝对值大小转换成的二进制数,称为原码。
3:反码:将二进制数按位取反,所得的新二进制数称为原二进制数的反码。
4:补码: 反码+1由以上可以得到.计算机储存有符号的整数时,是用该整数的补码进行储存的,0的原码、补码都是0;正数的原码、补码可以特殊理解为相同;负数的补码是它的反码加1。
范围: 正数[00000000 - 01111111] 即[0, 2^7 - 1]。
负数[10000000 - 11111111] 。
范围说明. 11111111 - 1 = 11111110,取反=00000001 即是-1. 10000000 -1 = 01111111,取反=10000000, 即是-128. 因此有一个有符号二进制表示范围是从[-128-127].解释二:大家都知道数据在计算机中都是按字节来储存了,1个字节等于8位(1Byte=8bit),而计算机只能识别0和1这两个数,所以根据排列,1个字节能代表256种不同的信息,即2^8(0和1两种可能,8位排列),比如定义一个字节大小的无符号整数(unsigned char),那么它能表示的是0~255(0~2^8 -1)这些数,一共是256个数,因为,前面说了,一个字节只能表示256种不同的信息。
别停下,还是一个字节的无符号整数,我们来进一步剖析它,0是这些数中最小的一个,我们先假设它在计算机内部就用8位二进制表示为00000000(从理论上来说也可以表示成其他不同的二进制码,只要这256个数每个数对应的二进制码都不相同就可以了),再假设1表示为00000001,2表示为00000010,3表示为00000011,依次类推,那么最大的那个数255在8位二进制中就表示为最大的数11111111,然后,我们把这些二进制码换算成十进制看看,会发现刚好和我们假设的数是相同的,而事实上,在计算机中,无符号的整数就是按这个原理来储存的,所以告诉你一个无符号的整数的二进制码,你就可以知道这个数是多少,而且知道在计算机中,这个数本身就是以这个二进制码来储存的。
原码、反码、补码⼀、什么是原码、反码、补码原码:将⼀个整数,转换成⼆进制,就是其原码。
如单字节的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)上,在⼈们的计算概念中零是没有正负之分的。
(印度⼈⾸先将零作为标记并放⼊运算之中,包含有零号的印度数学和⼗进制计数对⼈类⽂明的贡献极⼤)。
原码反码补码定义
计算机中的数据,其本质都是以⼆进制码存储。
计算机系统的内存储器,是由许多称为字节的单元组成的,1个字节由8个⼆进制位(bit)构成,每位的取值为0/1。
最右端的那1位称为“最低位”,编号为0;最左端的那1位称为“最⾼位”,⽽且从最低位到最⾼位顺序,依次编号。
原码:是最简单的机器数表⽰法。
⽤最⾼位表⽰符号位,‘1’表⽰负号,‘0’表⽰正号。
其他位存放该数的⼆进制。
例如,+9的原码是 00001001
└→符号位上的0表⽰正数
例如,+9的原码是 00001001
└→符号位上的0表⽰正数
反码:
数值的反码表⽰分两种情况:
1、正数的反码:与原码相同。
例如,+9的反码是00001001。
2、负数反码:符号位为1不变,其余各位为该数绝对值的原码按位取反(1变0、0变1)。
例如,-9的反码:因为是负数,则符号位为“1”;其余7位为按位取反1110110,所以-9的反码是11110110。
3、补码:
补码的表⽰⽅法是:
1、正数的补码就是其本⾝。
例如,+9的补码是00001001。
2、负数的补码是在其原码的基础上, 符号位为1不变, 其余各位取反, 最后+1. (即在反码的基础上+1)。
例如,-9的补码为(11110110+1=11110111)11110111。
计算机中原码、反码和补码的概念
在计算机中,我们使用三种主要的编码方式来表示整数,它们分别是原码、反码和补码。
每种编码方式都有其特定的表示方法和应用场景。
1.原码概念
原码就是将二进制数的最高位作为符号位,其余位表示数值。
正数的符号位为0,负数的符号位为1。
因此,原码表示的整数范围是-2^n-1到2^n-1,其中n是原码的位数。
例如,8位原码可以表示的范围是-128到127。
原码的优点是直观易懂,易于实现。
但原码也存在一些缺点,如不能直接进行加减运算,需要先进行符号扩展。
2.反码概念
反码是用来表示负数的二进制编码方式。
对于正数,反码与其原码相同。
对于负数,反码是将其原码除符号位以外的所有位取反(即0变为1,1变为0)。
例如,8位反码中,+7的编码为00000111,而-7的编码为11111000。
反码的优点是可以直接进行加减运算,不需要进行符号扩展。
但反码的缺点是不易于理解和记忆。
3.补码概念
补码是用来表示负数的另一种二进制编码方式。
与反码不同的是,补码在表示负数时会对符号位以外的所有位取反后加1。
因此,补码可以看作是反码加1的结果。
例如,8位补码中,+7的编码为00000111,而-7的编码为11111001。
补码的优点是可以直接进行加减运算,同时也可以进行减法运算而不需要进行符号扩展。
此外,补码还具有一些其他的优点,如易于理解和记忆、适用于有符号整数等。
因此,在现代计算机系统中,补码被广泛采用。
原码,反码,补码数在计算机中是以二进制形式表示的。
数分为有符号数和无符号数。
原码、反码、补码都是有符号定点数的表示方法。
一个有符号定点数的最高位为符号位,0是正,1是副。
以下都以8位整数为例,原码就是这个数本身的二进制形式。
例如0000001 就是+11000001 就是-1正数的反码和补码都是和原码相同。
负数在计算机中,负数以其正值的补码形式表达。
什么叫补码呢?这得从原码,反码说起。
原码:一个整数,按照绝对值大小转换成的二进制数,称为原码。
比如00000000 00000000 00000000 00000101 是5的原码。
反码:将二进制数按位取反,所得的新二进制数称为原二进制数的反码。
取反操作指:原为1,得0;原为0,得1。
(1变0; 0变1)比如:将00000000 00000000 00000000 00000101每一位取反,得11111111 11111111 11111111 11111010。
称:11111111 11111111 11111111 11111010 是00000000 00000000 00000000 00000101 的反码。
反码是相互的,所以也可称:11111111 11111111 11111111 11111010 和00000000 00000000 00000000 00000101 互为反码的反码是将其原码除符号位之外的各位求反[-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 //负数时,补码为原码取反+10.1101原码:0.1101反码:0.1101 //正数时,反码=原码补码:0.1101 //正数时,补码=原码-0.1101原码:1.1101反码:1.0010 //负数时,反码为原码取反补码:1.0011 //负数时,补码为原码取反+1总结:在计算机内,定点数有3种表示法:原码、反码和补码所谓原码就是前面所介绍的二进制定点表示法,即最高位为符号位,“0”表示正,“1”表示负,其余位表示数值的大小。
计算机中的原码、补码与反码⼀、原码: 所谓原码就是当前数字的⼆进制表现形式,int为例,第⼀位表⽰符号 (0正数 1负数)简单期间⼀个字节表⽰ +7的原码为: 00000111 -7的原码为: 10000111 对于原码来说,绝对值相等的正数和负数只有符号位不同。
⼆、反码: 正数的反码就是本⾝。
负数的反码是⼆进制保留符号位。
剩余位取反,⽐如-1的反码是1111 1110;三、补码: 正数的反码、补码、原码都是⼀样的,负数的补码是在其反码的基础上+1,⽐如-1的补码是1111 1111。
为什么要使⽤补码呢: 我们知道,0是不分正数还是负数的,也就是说,如果使⽤原码表⽰0的话,有两种表⽰⽅式,即00000000与10000000,这对计算来说很不⽅便。
如果我们使⽤补码来表⽰的话: 正数的0的表⽰: 因为正数的原码、反码、补码都是相同的。
所以正数0的反码与补码都是00000000; 负数的0的表⽰: 负数的0的原码是10000000,它的补码也就是在其反码的基础上+1,10000000的反码为符号位不变,剩余位取反,即为11111111,再加⼀的话为00000000,这样的话0的正数表⽰与负数表⽰都是00000000。
其实还有⼀个更重要的原因:就是利⽤⾼位溢出,将减法运算变成加法运算。
这样可以简化运算的设计:⽐如计算3-2,我们可以当做3+(-2)来运算:化为⼆进制: 3:0000 0011; -2:原码:1000 0010;反码:1111 1101;补码在反码基础上+1,即为:1111 1110这样3+(-2)的计算为:1000 0010 + 1111 1110 -------------------- ⾼位溢出结果为:0000 0001在计算机系统中,数值都是以补码来表⽰和存储的。
计算机计算过程是先转换成补码,再按位相加。
原码、补码和反码(1)原码表示法原码表示法是机器数的一种简单的表示法。
其符号位用0表示正号,用:表示负号,数值一般用二进制形式表示。
设有一数为x,则原码表示可记作〔x〕原。
例如,X1= +1010110X2= 一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)反码表示法机器数的反码可由原码得到。
简述什么是原码、反码、补码,以及它们之间的关系。
用最少有效数字的二进制补码运
原码:原码主要用于系统存储和传输数据,其以符号位表示正负,
除符号位以外全部为数值位。
原码是把数字真正处理,有正有负,但
其转换容易出现虚部问题。
反码:反码指的是原码的反码,符号位不变,其余位取反,正数的反
码与原码相同。
负数的反码都是在原码的基础上,符号位不变,非符
号位取反后得到。
补码:补码指的是在原码基础上,除了符号位,其余所有位取反(即1变0,0变1),然后符号位加上1得到的。
正数的补码与原码相同,而
负数的补码是其反码+1。
原码、反码、补码之间的关系:原码、反码、补码互相之间相互转换,原码可以通过反码得到补码,反码可以通过原码得到补码,而补码既
可以通过原码得到反码,又可以通过反码得到原码,所以原码、反码、补码之间是存在一种直接关系的。
用最少有效数字的二进制补码来表
示一个数,这个数就被称为补码有效数字,从而可以以补码的方式实
现对数的存储和传输。
原码、反码、补码的定义所有的负数的反码等于原码各位取反;补码等于反码加一.十六进制也是先化成2进制的在化补码。
补码的用途是让机器学会减法运算的。
应为所有的处理器是电路做的,电路其实只是加法器,只能做加法。
如何能让电脑做减法呢,就用补码啊。
减去一个数就等于加上她的补码。
一、原码、反码、补码的定义1、原码的定义①小数原码的定义[X]原=X 0≤X<1 1-X-1<X≤0例如:X=+0.1011,[X]原=01011 X=-0.1011[X]原=11011②整数原码的定义[X]原=X 0≤X<2n 2n-X-2n<X≤0 2、补码的定义①小数补码的定义[X]补=X 0≤X<1 2+X-1≤X<0例如:X=+0.1011,[X]补=01011 X=-0.1011,[X]补=10101②整数补码的定义[X]补=X 0≤X<2n 2n+1+X-2n≤X<0 3、反码的定义①小数反码的定义[X]反=X 0≤X<1 2-2n-1-X-1<X≤0例如:X=+0.1011[X]反=01011 X=-0.1011[X]反=10100②整数反码的定义[X]反=X 0≤X<2n 2n+1-1-X-2n<X≤0 4.移码:移码只用于表示浮点数的阶码,所以只用于整数。
①移码的定义:设由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]补=01011 X=-1011[X]移=00101[X]补=10101③移码运算应注意的问题:◎对移码运算的结果需要加以修正,修正量为2n,即对结果的符号位取反后才是移码形式的正确结果。
简述原码、补码和反码的含义原码、补码和反码是用于表示有符号整数的三种不同的编码方式。
它们在计算机系统中用于处理带符号数的溢出和运算问题。
1. 原码(Sign and Magnitude):
•原码是最直观的一种表示方法,其中整数的符号用最高位表示(0表示正,1表示负),其余位表示数值的绝对值。
•例如,+5的8位原码表示为 00000101,-5表示为 10000101。
2. 反码(Ones' Complement):
•反码的符号位与原码相同,但是数值位取反。
即,正数的反码与原码相同,负数的反码是将其原码中的每一位取反。
•例如,+5的8位反码表示为 00000101,-5的8位反码表示为11111010。
3. 补码(Two's Complement):
•补码是计算机系统中最常用的表示方法,它解决了反码中的0有两个表示的问题。
•正数的补码与原码相同,而负数的补码是其反码加1。
•例如,+5的8位补码表示为 00000101,-5的8位补码表示为11111011。
这三种表示方法中,原码、反码和补码都有其优缺点。
补码在进行加减运算时更为方便,而且只有一种表示0的方式,因此在计算机中广泛应用。
在补码表示中,正数、负数的加法和减法可以通过相同的硬件电路实现,简化了计算机的设计。
1.原码表示法(1)整数原码的定义为:式中x为真值,n为整数的位数。
小数原码的定义为注:正数的原码是把符号位改为‘0’,负数的原码把符号位改为‘1’即可。
例:当x=+0.1101时,[x]原=0.1101当x=-0.1101时,[x]原=1-(-0.1101)=1.1101(2)原码的表数范围。
对于定点整数:一个n+1位原码能表示的最大正数为01…11,即2n-1;能表示的最小数为绝对值最大的负数111…1,即-(2n-1)。
所以原码能表示的数值范围为: -(2n-1) ≤ x≤ 2n-1。
例:字长为8位的定点整数,x的原码的表示范围为(-127 ,127).对于定点小数:一个n+1位定点小数原码能表示的最大正数为0.1…11,即1-2-n;能表示的最小数为绝对值最大的负数为1.11…1,即-(1-2-n)。
定点小数原码的数值范围为: -(1-2-n) ≤ x≤ 1-2-n。
2.反码表示法例:正数的反码和原码一样,负数的反码把原码除符号位以外的所有位取反。
例:字长为8位的定点整数,x的反码的表示范围为(-127 ,127).3.补码表示法(1)整数补码的定义为:式中x为真值,n为整数的位数。
小数补码的定义为注:正数的补码是和原码相同,负数的补码把原码除符号位以外的所有为取反(反码),再加‘1’例:当x=+0.1101时,[x]原=0.1101,[x]补=0.1101当x=-0.1101时,[x]原=1.1101,[x]补=1.0010+1=1.0011[x]补=2+x=10.0000-0.1101=1.0011(2)补码的表数范围。
一个n+1位整数补码能表示的最大数是011…1,即2n-1;能表示的最小数为100…0,即-2n。
所以它能表示的数值范围是:-2n≤ x≤ 2n-1例:字长为8位的定点整数,x的补码的表示范围为(-128 ,127).一个n+1位小数补码能表示的最大数是0.11…1,即1-2-n;能表示的最小数为1.00… 0,即-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为机器字长。
原码反码补码和移码原码,反码,补码和移码的相关概念一:对于正数,原码和反码,补码都是一样的,都是正数本身。
对于负数,原码是符号位为1,数值部分取X绝对值的二进制。
反码是符号位为1,其它位是原码取反。
补码是符号位为1,其它位是原码取反,未位加1。
也就是说,负数的补码是其反码未位加1。
移码就是将符号位取反的补码二:在计算机中,实际上只有加法运算,减法运算也要转换为加法运算,乘法转换为加法运算,除法转换为减法运算。
三:在计算机中,对任意一个带有符号的二进制,都是按其补码的形式进行运算和存储的。
之所以是以补码方式进行处理,而不按原码和反码方式进行处理,是因为在对带有符号位的原码和反码进行运算时,计算机处理起来有问题。
(具体原因见理解原码,反码与补码)而按补码方式,一方面使符号位能与有效值部分一起参加运算,从而简化运算规则.另一方面使减法运算转换为加法运算,进一步简化计算机中运算器的线路设计正零: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 //正数时,补码,原码移码:11011 //原数+10000 ,1011原码:11011反码:10100 //负数时,反码为原码取反补码:10101 //负数时,补码为原码取反,1 移码:00101 //原数+10000 0(1101原码:0.1101反码:0.1101 //正数时,反码,原码补码:0.1101 //正数时,补码,原码移码:1.1101 //原数+1,0(1101原码:1.1101反码:1.0010 //负数时,反码为原码取反补码:1.0011 //负数时,补码为原码取反,1移码:0.0010 //原数+1总结:在计算机内,定点数有3种表示法:原码、反码和补码所谓原码就是前面所介绍的二进制定点表示法,即最高位为符号位,“0”表示正,“1”表示负,其余位表示数值的大小。
2.1 原码、反码与补码在计算机内的数(称之为“机器数”)值有3种表示法:原码、反码和补码。
所谓原码就是带正、负号的二进制数,即最高位为符号位,“0”表示正,“1”表示负,其余位表示数值的大小。
反码表示法规定:正数的反码与其原码相同;负数的反码是对其原码逐位取反,但符号位除外。
补码表示法规定:正数的补码与其原码相同;负数的补码是在其反码的末位加1。
由此可见,这三种表示法中,关键是负数的表示方式不一样。
2.2.1 正负数表示、定点数与浮点数在计算机内,通常把1个二进制数的最高位定义为符号位,用“0”表示正数,“1”表示负数;其余位表示数值。
规定小数点位置固定不变的数称为“定点数”;小数点的位置不固定,可以浮动的数称为“浮点数”。
2.2.2 原码原码表示法是定点数的一种简单的表示法。
用原码表示带符号二进制数时,符号位用0表示正,1表示负;数值位保持不变。
原码表示法又称为符号-数值表示法。
1. 小数原码表示法设有一数为x,则原码表示可记作[x]原(下标表示)。
例如,X1= +1010110 ;X2= -1001010原码表示数的范围与二进制位数有关。
设二进制小数X=±0.X1X2…Xm,则小数原码的定义如下:例如:X=+0.1011时,根据以上公式可得[X]原=0.1011;X=-0.1011时,根据以上公式可得[X]原= 1-(-0.1011)=1.1011=1.1011当用8位二进制来表示小数原码时,其表示范围为:最大值为0.1111111,其真值约为(0.99)10 ;最小值为1.1111111,其真值约为(-0.99)10。
根据定义,小数“0”的原码可以表示成0.0…0或1.0…0。
2. 整数原码表示法整数原码的定义如下:例如:X=+1101时,根据以上公式可得[X]原=01101;X=-1101时,根据以上公式可得[X]原=24-(-1101)=10000+1101=11101当用8位二进制来表示整数原码时,其表示范围为:最大值为01111111,其真值为(127)10 ;最小值为11111111,其真值为(-127)10 。
原码、反码、补码原码是什么? 原码就是早期⽤来表⽰数字的⼀种⽅式: ⼀个正数,转换为⼆进制位就是这个正数的原码。
负数的绝对值转换成⼆进制位然后在⾼位补1就是这个负数的原码,说的更通俗点,负数的原码就是⾼位为1的对应正数的原码。
举例说明: int类型的 3 的原码是 11B(B表⽰⼆进制位),在32位机器上占四个字节,那么⾼位补零就得: 00000000 00000000 00000000 00000011 int类型的 -3 的绝对值的⼆进制位就是上⾯的 11B 展开后⾼位补零就得: 10000000 00000000 00000000 00000011 但是原码有⼏个缺点,零分两种 +0 和 -0 。
很奇怪是吧!还有,在进⾏不同符号的加法运算或者同符号的减法运算的时候,不能直接判断出结果的正负。
你需要将两个值的绝对值进⾏⽐较,然后进⾏加减操作,最后符号位由绝对值⼤的决定。
于是反码就产⽣了。
反码是什么? 正数的反码就是原码,负数的反码等于原码除符号位以外所有的位取反 举例说明: int类型的 3 的反码是 00000000 00000000 00000000 00000011 和原码⼀样没什么可说的 int类型的 -3 的反码是 11111111 11111111 11111111 11111100 除开符号位所有位取反 解决了加减运算的问题,但还是有正负零之分,然后就到补码了 补码是什么? 正数的补码与原码相同,负数的补码为其原码除符号位外所有位取反(得到反码了),然后最低位加1. 还是举例说明: int类型的 3 的补码是: 00000000 00000000 00000000 00000011 int类型的 -3 的补码是 11111111 11111111 1111111 11111101 就是其反码加1最后总结⼀下: 正数的反码和补码都与原码相同。
负数的反码为对该数的原码除符号位外各位取反。
计算机基础(1)-原码、反码、补码⼀、概念理解1.机器数⼀个数在计算机中的⼆进制表上形式,叫做这个数的机器数;机器数是带符号的,最⾼位存放符号(0正,1负);00000011和10000011就是机器数;2.真值将带符号的机器数对应的真正值称为机器数的真值;00000011的真值是+1;10000011的真值是-1;3.原码原码就是符号位加上真值的绝对值;[+1]=[0000 0001]原;[ -1]=[1000 0001]原;4.反码正数的反码是其本⾝;负数的反码是在其原码的基础上,符号位不变,其余各个位取反;[+1]=[0000 0001]原 = [0000 0001]反;[- 1]=[1000 0001]原 = [1111 1110]反;5.补码正数的补码是其本⾝;负数的补码是在反码的基础上+1;[+1]=[0000 0001]原 = [0000 0001]反= [0000 0001]补;[- 1]=[1000 0001]原 = [1111 1110]反= [1111 1111]补;⼆、为什么使⽤原码、反码、补码1.因为计算机只知道加法、对于减法就是加上⼀个负数;2.为了是计算机运算设计更加简单,也将符号位参与运算;3.使⽤原码做运算1-1=1+(-1)=[0000 0001]原 + [1000 0001]原 = [1000 0010]原 = – 2得出结论:使⽤原码计算减法,让符号位参与计算,结果是不正确的4.使⽤反码做运算1-1=1+(-1)=[0000 0001]反+[1111 1110]反=[1111 1111]反 = [1000 0000]原 = –0得出结论:使⽤反码计算减法,解决了真值部分的不正确问题,唯⼀问题是“0”这个特殊值上,0带符号是没有意义的[0000 0000]反 = [1000 0000]反 = 0,且0的反码有两种表⽰形式5.使⽤补码做运算1-1=1+(-1)=[0000 0001]补+[1111 1111]补= [0000 0000]补=[0000 0000]原= 0这样⽤0⽤[0000 0000]表⽰,⽽⽤[1000 0000]表⽰-128(-1)+(-127)=[1000 0001]原+[1111 1111]原=[1111 1111]补+[1000 0001]补=[1000 0000]补实际上是使⽤以前的-0的补码来表⽰-128,所以-128并没有原码和反码得出结论:使⽤补码计算,不仅修复了0的符号存在两个编码问题,⽽且还能多表⽰⼀个最低数三、原码、反码、补码表⽰的范围原码:第⼀位是符号位,所有8位⼆进制的取值范围是:[1111 1111,0111 1111] 即 [-127,127]反码:反码是通过原码得到的,所以范围和原码⼀样,也是[-127,127]补码:补码⽐反码多了⼀个最低数,即范围是[-128,127]四、扩展1.如何⽤⼀个正数替代⼀个负数场景⼀:钟表当前时间是6点,怎么把时间设置成4点:⽅式⼀:往回拨2个⼩时:6-4= 2⽅式⼆:往前拨10个⼩时(6+10)mod 12 = 4⽅式三:往前拨22个⼩时(6+22)mod 12 = 42.同余的概念两个整数a,b,若它们除以整数m所得的余数相等,则称a,b对于模m同余,记作 a ≡ b (mod m),读作 a与b关于模m 同余场景⼆:4 mod 12 = 4,即4 ≡ 4(mod 12)16 mod 12 = 4,即16 ≡ 4(mod 12)28 mod 12 = 4,即28 ≡ 4(mod 12)则4,16,28关于模12同余3.负数取模x mod y = x-y[x/y]x mod y 等于 x 减去 y乘上x与y的商的下界场景三:(-2) mod 12 = –2 + 12*(-1) = 10,即(-2) ≡ 10(mod 12)(-4) mod 12 = –4 + 12*(-1) = 8 ,即(-4) ≡ 8 (mod 12)(-5) mod 12 = –5 + 12*(-1) = 7 ,即(-5) ≡ 7 (mod 12)现在我们为⼀个负数找到了它正数同余数4.在从⼆进制的问题,理解下2-1=1问题2-1=2+(-1)=[0000 0010]原+[1000 0001]原=[0000 0010]反+[1111 1110]反-1的反码表⽰是1111 1110,如果[1111 1110]认为是原码,则[1111 1110]原 = -126,它的真值为126。
原码补码和反码的具体定义
数在计算机中是以二进制形式表示的。
数分为有符号数和无符号数。
原码、反码、补码都是有符号定点数的表示方法。
一个有符号定点数的最高位为符号位,0是正,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。