原码、反码、补码的换算
计算机中的原码、反码和补码
![计算机中的原码、反码和补码](https://img.taocdn.com/s3/m/033bcb89cc22bcd126ff0cd2.png)
补码补码补码(two's complement) 1、在计算机系统中,数值一律用补码来表示(存储)。
主要原因:使用补码,可以将符号位和其它位统一处理;同时,减法也可按加法来处理。
另外,两个用补码表示的数相加时,如果最高位(符号位)有进位,则进位被舍弃。
2、补码与原码的转换过程几乎是相同的。
补码概述求给定数值的补码表示分以下两种情况:(1)正数的补码与原码相同。
【例1】+9的补码是00001001。
(备注:这个+9的补码说的是用8位的2进制来表示补码的,补码表示方式很多,还有16位2进制补码表示形式,以及32位2进制补码表示形式等。
)(2)负数的补码负数的补码是对其原码逐位取反,但符号位除外;然后整个数加1。
同一个数字在不同的补码表示形式里头,是不同的。
比方说-15的补码,在8位2进制里头是11110001,然而在16位2进制补码表示的情况下,就成了1111111111110001。
在这篇补码概述里头涉及的补码转换默认了把一个数转换成8位2进制的补码形式,每一种补码表示形式都只能表示有限的数字。
【例2】求-7的补码。
因为给定数是负数,则符号位为“1”。
后七位:+7的原码(0000111)→按位取反(1111000)→加1(1111001)所以-7的补码是11111001。
已知一个数的补码,求原码的操作分两种情况:(1)如果补码的符号位为“0”,表示是一个正数,其原码就是补码。
(2)如果补码的符号位为“1”,表示是一个负数,那么求给定的这个补码的补码就是要求的原码。
再举一个例子:求-64的补码+64:0100000011000000【例3】已知一个补码为11111001,则原码是10000111(-7)。
因为符号位为“1”,表示是一个负数,所以该位不变,仍为“1”。
其余七位1111001取反后为0000110;再加1,所以是10000111。
在“闲扯原码、反码、补码”文件中,没有提到一个很重要的概念“模”。
c语言中的原码_反码_补码
![c语言中的原码_反码_补码](https://img.taocdn.com/s3/m/0e853071a26925c52cc5bf42.png)
在计算机内,定点数有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来代替,这就把减法问题转化成加法问题了(注:计算机的硬件结构中只有加法器,所以大部分的运算都必须最终转换为加法)。
原码、反码、补码的求法
![原码、反码、补码的求法](https://img.taocdn.com/s3/m/4e627509fd4ffe4733687e21af45b307e871f971.png)
反码在计算机内,定点数有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)。
原码、反码、补码的定义
![原码、反码、补码的定义](https://img.taocdn.com/s3/m/f26768c3b8f3f90f76c66137ee06eff9aef8492c.png)
原码、反码、补码的定义所有的负数的反码等于原码各位取反;补码等于反码加一.十六进制也是先化成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,即对结果的符号位取反后才是移码形式的正确结果。
c语言中的原码 反码 补码
![c语言中的原码 反码 补码](https://img.taocdn.com/s3/m/60db45b569dc5022aaea0023.png)
0 1 0 1 1 1 0 1 B +93
思考:这两个题目,按照正常的法则来运算,但结果显然不正确,这是怎么回事呢?
答案:这是因为发生了溢出。
如果计算机的字长为n位,n位二进制数的最高位为符号位,其余n-1位为数值位,采用补码表示法时,可表示的数X的范围是 -2n-1≤X≤2n-1-1
计算原码只要在转化的二进制数前面加上相应的符号位就行了.
2.反码的求法:对于负数,将原码各位取反,符号位不变.
3.补码的求法:对于负数,将反码加上二进制的1即可,也就是反码在最后一位上加上1就是补码了.
(1) 原码:在数值前直接加一符号位的表示法。
例如: 符号位 数值位
[+7]原= 0 0000111 B
[-7]原= 1 0000111 B
注意:a. 数0的原码有两种形式:
[+0]原=00000000B [-0]原=10000000B
c. 若字长为8位,则补码所表示的范围为-128~+127;进行补码运算时,应注意所得结果不应超过补码所能表示数的范围。
2.原码、反码和补码之间的转换
由于正数的原码、补码、反码表示方法均相同,不需转换。
在此,仅以负数情况分析。
(1) 已知原码,求补码。
1 +1
1 0 0 1 0 0 1 0 原码
1.3.2 有符号数运算时的溢出问题
请大家来做两个题目:
两正数相加怎么变成了负数???
1)(+72)+(+98)=?
0 1 0 0 1 0 0 0 B +72
+ 0 1 1 0 0 0 1 0 B +98
c语言 原码,反码和补码的转换方法
![c语言 原码,反码和补码的转换方法](https://img.taocdn.com/s3/m/ed1c50236ad97f192279168884868762caaebb1c.png)
c语言原码,反码和补码的转换方法在 C 语言中,数字的表示方式有两种:原码和反码,以及补码。
这三种表示方式相互转换的关系比较复杂,下面将介绍它们的转换方法以及它们的优缺点。
1. 原码和反码的转换方法在 C 语言中,数字的表示方式是通过其二进制位来表示的。
因此,如果需要将一个数字从原码转换为反码,只需要将其二进制位从0到255进行遍历,然后将每个二进制位的值减去其对应的原码值即可。
反码的表示方式与原码相反,即从256到0进行遍历,然后将每个二进制位的值加上其对应的反码值即可。
例如,假设我们要将一个8位的二进制数字转换为原码和反码,我们可以按照以下步骤进行:```| 0 1 2 3 4 5 6 7 8 ||------|----------|----------|----------|| 9 10 11 12 13 14 15 16 17 18 19 ||-------|----------|----------|----------|| 20 21 22 23 24 25 26 27 28 29 ||-------|----------|----------|----------|| 30 31 32 33 34 35 36 37 38 39 ||-------|----------|----------|----------|| 40 41 42 43 44 45 46 47 48 49 ||-------|----------|----------|----------|| 50 51 52 53 54 55 56 57 58 59 ||-------|----------|----------|----------|| 60 61 62 63 64 65 66 67 68 69 ||-------|----------|----------|----------|| 70 71 72 73 74 75 76 77 78 79 ||-------|----------|----------|----------|| 80 81 82 83 84 85 86 87 88 89 ||-------|----------|----------|----------|| 90 91 92 93 94 95 96 97 98 99 ||-------|----------|----------|----------|| 255 256 257 258 259 260 261 262 263 ||------|----------|----------|----------|| 0 1 2 3 4 5 6 7 8 9 |```在上面的示例中,我们选择了0到79之间的所有数字进行了转换,因为这个数字的范围较小,而且转换结果的精度也比较高。
进制的转换原码、反码、补码
![进制的转换原码、反码、补码](https://img.taocdn.com/s3/m/21f3c486f46527d3250ce016.png)
进制的转换原码、反码、补码科名片英文名称:Hex number system,是计算机中数据的一种表示方法。
同我们日常中的十进制表示法不一样。
它由0-9,A-F组成,字母不区分大小写。
与10进制的对应关系是:0-9对应0-9;A-F对应10-15;N进制的数可以用0---(N-1)的数表示超过9的用字母A-F。
目录举例说明转换表达方法各码转换变量总结标准表示展开举例说明转换表达方法各码转换变量总结标准表示展开编辑本段举例说明10进制的32表示成16进制就是:2016进制的20表示成10进制就是:2×16^1+0×16^0=32编程中,我们常用的还是10进制.毕竟C/C++是高级语言。
比如:int a = 100,b = 99;不过,由于数据在计算机中的表示,最终以二进制的形式存在,所以有时候使用二进制,可以更直观地解决问题。
但二进制数太长了。
比如int 类型占用4个字节,32位。
比如100,用int类型的二进制数表达将是:0000 0000 0000 0000 0110 0100面对这么长的数进行思考或操作,没有人会喜欢。
因此,C,C++ 没有提供在代码直接写二进制数的方法。
用16进制或8进制可以解决这个问题。
因为,进制越大,数的表达长度也就越短。
不过,为什么偏偏是16或8进制,而不其它的,诸如9或20进制呢,2、8、16,分别是2的1次方、3次方、4次方。
这一点使得三种进制之间可以非常直接地互相转换。
8进制或16进制缩短了二进制数,但保持了二进制数的表达特点。
在下面的关于进制转换的课程中,你可以发现这一点。
编辑本段转换二进制转换十进制二进制数第0位的权值是2的0次方,第1位的权值是2的1次方……所以,设有一个二进制数:101100100,转换为10进制为:356用横式计算0 X2^0 + 0X 2^1 + 1X 2^2 + 0X2^3 + 0X2^4 + 1 X2^5 + 1 X2^6 + 0 X 2^7 + 1X 2^8 =3560乘以多少都是0,所以我们也可以直接跳过值为0的位:1X 2^2 + 1 X2^5 + 1X 2^6 + 1X 2^8 = 3564 + 32 + 64 + 256 =356八进制转换十进制八进制就是逢8进1。
原码-反码-补码及运算
![原码-反码-补码及运算](https://img.taocdn.com/s3/m/a7584a3e3186bceb18e8bb83.png)
原码,反码,补码及运算一、定义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当运算结果超出这个范围时,就不能正确表示数了,此时称为溢出。
补码进制转换详解 , 补码详解 ,进制转换详解
![补码进制转换详解 , 补码详解 ,进制转换详解](https://img.taocdn.com/s3/m/e39ad209c5da50e2524d7fe1.png)
由于十六进制转换成二进制相当直接,所以,我们需要将一个十进制数转换成 2 进制数时,也可以 先转换成 16 进制,然后再转换成 2 进制。 比如,十进制数 1234 转换成二制数,如果要一直除以 2,直接得到 2 进制数,需要计算较多次数。 所以我们可以先除以 16,得到 16 进制数:
被除数 计算过程 商
记住 8421,对于任意一个 4 位的二进制数,我们都可以很快算出它对应的 10 进制值。
下面列出四位二进制数 xxxx 所有可能的值(中间略过部分)
仅 4 位的 2 进制数 快速计算方法 十进制值
1111 = 8 + 4 + 2 + 1 = 15
F
1110 = 8 + 4 + 2 + 0 = 14
逻辑判断 用&或者&&做比较时,好像是一个效果啊 false & false 结果是 false
true & true 结果是 true
false && false true && true
结果是 false 结果是 true
其实他们之间有一个很大的差别:短路 举个例子来解释一下吧, false &true-->false false&&true-->false 单从结果上看,他们结果是一样的,都是 false 但是前者在运行的时候,计算机首先判断第一个条件为 false,然后判断第二个条件 true,然后判断 出结果为 false 而后者,首先也是判断第一个条件,当判断出为 false 时,程序立即终止,因为不管第二个条件是 什么,结果一定为 false
1000……………………01 (原码)负数的反码转换为原码 1000……………………01 原码
原码、反码、补码的求法
![原码、反码、补码的求法](https://img.taocdn.com/s3/m/b741da0cf12d2af90242e6c7.png)
同理,计算机的运算部件与寄存器都有一定字长的限制(假设字长为8),因此它的运算也是一种模运算。当计数器计满8位也就是256个数后会产生溢出,又从头开始计数。产生溢出的量就是计数器的模,显然,8位二进制数,它的模数为28=256。在计算中,两个互补的数称为“补码”。
2)补码的表示:
正数:正数的补码和原码相同。
在此,仅以负数情况分析。
(1) 已知原码,求补码。
例:已知某数X的原码为10110100B,试求X的补码和反码。
解:由[X]原=10110100B知,X为负数。求其反码时,符号位不变,数值部分按位求反;求其补码时,再在其反码的末位加1。
1 0 1 1 0 1 0 0 原码
2)(-83)+(-80)=?
1 0 1 0 1 1 0 1 B -83
+ 1 0 1 1 0 0 0 0 B -80
0 1 0 1 1 1 0 1 B +93
思考:这两个题目,按照正常的法则来运算,但结果显然不正确,这是怎么回事呢?
答案:这是因为发生了溢出。
如果计算机的字长为n位,n位二进制数的最高位为符号位,其余n-1位为数值位,采用补码表示法时,可表示的数X的范围是 -2n-1≤X≤2n-1-1
反码
在计算机内,定点数有3种表示法:原码、反码和补码。
所谓原码就是前面所介绍的二进制定点表示法,即最高位为符号位,“0”表示正,“1”表示负,其余位表示数值的大小。
补码进制转换详解 , 补码详解 ,进制转换详解
![补码进制转换详解 , 补码详解 ,进制转换详解](https://img.taocdn.com/s3/m/ae551bf94693daef5ff73d0c.png)
按位异或:0^0=0, 1^0=1, 0^1=1, 1^1=0正数的补码=原码=反码负数的补码=反码+1负数的反码=原码符号不变(0 -->1;1 -->0)1+1=2在计算机中 :补码+补码=补码0000……………………………………1 补码 + 0000……………………………………1 补码 = 0000………………………………… 10 补码———————————————————————————————————————1-2=1+(-2)= -1在计算机中 :补码+补码=补码 0000……………………………………1 补码 + 1111 …………………………………10 补码 = 1111………………………………… 11 补码逻辑判断用&或者&&做比较时,好像是一个效果啊 false & false 结果是false-2的原码 10000..............................10 -2的反码 111111 (01)+0000000000000000000000000001 -2的补码 =1111111…………………………10 -1的反码=补码-11111 (11)- 0000 (01)=1111……………………10 反码-1的原码=反码元符号不变(0-->1;1-->0)=1000……………………01 -1原码true & true 结果是truefalse && false 结果是falsetrue && true 结果是true其实他们之间有一个很大的差别:短路举个例子来解释一下吧,false &true-->falsefalse&&true-->false单从结果上看,他们结果是一样的,都是false但是前者在运行的时候,计算机首先判断第一个条件为false,然后判断第二个条件true,然后判断出结果为false而后者,首先也是判断第一个条件,当判断出为false时,程序立即终止,因为不管第二个条件是什么,结果一定为false位运算符~2= -32的补码取反000……………………10 原码=补码1111……………………01 取反后是一个负数的补码一个负数的反码1111 (01)- 0000 (01)=1111……………………00 一个负数的反码一个负数的原码= 一个负数的反码符号位不变(0-->1;1-->0)1111 (00)1000…………………011 一个负数的原码2&3=20000…………10 补码0000…………11 补码=0000…………10 补码都为1是才为11>>2 =00000……………………01 补码0000……………………00 算术右移两位(低位溢出,符号位不变,并用符号位不溢出的高位)-1>>2 = -11000……………………01 -1的原码1111……………………10 -1的反码1111……………………11 -1补码1111……………………11 (补码)算术右移两位(低位溢出,符号位不变,并用符号位不溢出的高位) 1000…………………00 (反码)负数的补码转换为反码1000……………………01 (原码)负数的反码转换为原码1000……………………01 原码1<<2 =20000……………………01补码0000…………………100 算术左移两位(符号位不变,低位补0)-1<<2 = -21000……………………01 -1的原码1111……………………10 -1的反码1111……………………11 -1补码1111…………………100 (补码)算术左移两位(符号位不变,低位补0) 1000…………………011 (反码)负数的补码转换为反码1000…………………100 (原码)负数的反码转换为原码1000…………………100 原码3>>>2 =00000…………………0011 3(补码=原码)0000…………………0000 (补码)低位溢出,高位补0十进制数(1098)10=1×103+0×102+9×101+8×100(2C.4B)16=2×161+C×160+4×16-1+B×16-2(101.11)2=1×22+0×21+1×20+1×2-1+1×2-210 -->22| 100 余数2| 50 0(最低位)2| 25 02| 12 12| 6 02| 3 02| 1 10 1 (最高位)(100)=(1100100)0. 6875× 21.3750 …… 整数部分为10. 3750× 20. 7500 …… 整数部分为00. 7500× 21. 5000 …… 整数部分为10. 5000× 21. 0000 …… 整数部分为1 即:(0.6875)10 = (0.1011)2(256.73)10=2×102+5×101+6×100+7×10-1+3×10-2=200+50+6+0.7+0.03=256.73(205)8=2×82+0×81+5×80=128+0+3 =(133)10[例] 十进制数7155.625对应的十六进制数是什么?解:16 7155 余数 316 447 余数15(F)16 27 余数11(B)16 1 余数 1则,(7155)10=(1BF3)160.625×1610.000 整数部分10(A) 则,(0.625)10=(0.A)16(7155.625)10=(1BF3.A)16将十进制数3929转换成二进制数。
正数与负数的原码
![正数与负数的原码](https://img.taocdn.com/s3/m/dd98730a76c66137ee061975.png)
正数与负数的原码,反码,补码1.正数的原码,补码,反码都相同,都等于它本身2.负数的原码符号位为1,其余不变负数的补码是:符号位为1,其余各位求反,末位加1 反码是:符号位为1,其余各位求反,但末位不加1 也就是说,反码末位加上1就是补码-1011 原码:11011 反码:10100 //负数时,反码为原码取反补码:10101 //负数时,补码为原码取反+1 移码:00101 //原数+10000计算机的二进制带符号运算为什么 ...以8b为例对比如下:(谁能给我补补课,说说为什么是正0负1,按照我的理解应该是正1负0更符合人类的思维,前者是进行了一次技术上的mapping了)正号:0 负号:1 原码:+1 0 000 0001 -1 1 000 0001 反码:+1 ... -1 1 111 1110 补码:+1 ... -1 1 111 1111 1+(-1)=0 0 000 0001 ...有符号的范围,-128~+127详解这是一个困惑了我几年的问题,它让我对现在的教科书和老师极其不满,从我N年前开始摸电脑时,就几乎在每一本C++教科书上都说,8位有符号的取值范围是-128~+127,为什么不是-127~+127呢,后来的java,int的聚值范围,再32位计算,-2^31 ~ +2^31-1,可是,却从来没有任何一本教科书或一个老师比我解释过这个问题原因没有在工作上或者是什么地方直接遇到它,所以我也一直忽略它,但心 ...补码的性质补码的补码是原码:设原码为a,a的补码为b,b的补码为c 则b = ~a + 1; c = ~b + 1 = ~(~a + 1) + 1 = a + ~(1) + 1 = a 补码的计算方法:正数的补码是其本身;负数的补码是原码按位取反,末尾加1,符号位不变。
即从最低位开 ...准备笔试原码、补码和反码一个二进制用原码或补码表示时,其最高位为符号位,0表示正,1表示负。
原码、反码、补码,计算机中负数的表示
![原码、反码、补码,计算机中负数的表示](https://img.taocdn.com/s3/m/6d6f90d688eb172ded630b1c59eef8c75fbf9506.png)
原码、反码、补码,计算机中负数的表⽰原码:将⼀个整数,转换成⼆进制,就是其原码。
如单字节的5的原码为:0000 0101;-5的原码为1000 0101。
反码:正数的反码就是其原码;负数的反码是将原码中,除符号位以外,每⼀位取反。
如单字节的5的反码为:0000 0101;-5的反码为1111 1010。
补码:正数的补码就是其原码;负数的反码+1就是补码。
如单字节的5的补码为:0000 0101;-5的补码为1111 1011。
在计算机中,正数是直接⽤原码表⽰的,如单字节5,在计算机中就表⽰为:0000 0101。
负数⽤补码表⽰,如单字节-5,在计算机中表⽰为1111 1011。
这⼉就有⼀个问题,为什么在计算机中,负数⽤补码表⽰呢?为什么不直接⽤原码表⽰?如单字节-5:1000 0101。
我想从软件上考虑,原因有两个 1、表⽰范围 拿单字节整数来说,⽆符号型,其表⽰范围是[0,255],总共表⽰了256个数据。
有符号型,其表⽰范围是[-128,127]。
先看⽆符号,0表⽰为0000 0000,255表⽰为1111 1111,刚好满⾜了要求,可以表⽰256个数据。
再看有符号的,若是⽤原码表⽰,0表⽰为0000 000。
因为咱们有符号,所以应该也有个负0(虽然它还是0):1000 0000。
那我们看看这样还能够满⾜我们的要求,表⽰256个数据么? 正数,没问题,127是0111 1111,1是0000 0001,当然其它的应该也没有问题。
负数呢,-1是1000 0001,那么把负号去掉,最⼤的数是111 1111,也就是127,所以负数中最⼩能表⽰的数据是-127。
这样似乎不太对劲,该如何去表⽰-128?貌似直接⽤原码⽆法表⽰,⽽我们却有两个0。
如果我们把其中的⼀个0指定为-128,不⾏么?这也是⼀个想法,不过有两个问题:⼀是它与-127的跨度过⼤;⼆是在⽤硬件进⾏运算时不⽅便。
所以,计算机中,负数是采⽤补码表⽰。
原码反码补码计算口诀
![原码反码补码计算口诀](https://img.taocdn.com/s3/m/baa338a56429647d27284b73f242336c1eb93089.png)
原码反码补码计算口诀在计算机中,原码、反码、补码是十分重要的知识点,也是非常基础的内容。
学习计算机相关的知识,必须掌握原码、反码、补码的转换方法,否则会导致计算错误。
今天,我们来聊一聊“原码反码补码计算口诀”。
一、原码首先,我们来介绍一下原码。
原码是一种十进制数在计算机中的二进制表示方法。
在计算机中,原码表示方式为首位为符号位,0代表正数,1代表负数,其余位表示数值。
例如,十进制数“+7”,在计算机中的原码为“00000111”;十进制数“-7”,在计算机中的原码为“10000111”。
二、反码接着,我们来介绍一下反码。
反码也是一种十进制数在计算机中的二进制表示方法。
在计算机中,反码的表示方式为正数原码不变,负数将原码除符号位外的位取反。
例如,十进制数“+7”,在计算机中的反码为“00000111”;十进制数“-7”,在计算机中的反码为“11111000”。
三、补码最后,我们来介绍一下补码。
在计算机中,补码表示方式为正数原码不变,负数将原码除符号位外的位取反,然后加一。
例如,十进制数“+7”,在计算机中的补码为“00000111”;十进制数“-7”,在计算机中的补码为“11111001”。
四、原码反码补码计算口诀现在,我们已经介绍了原码、反码、补码的概念,下面是它们之间的转换口诀:1、由原码求反码:负数取反,正数不变。
2、由反码求原码:符号位不变,其余取反。
3、由补码求原码:符号位不变,其余取反后加一。
4、由原码求补码:负数先取反再加一,正数不变。
5、由反码求补码:负数先加一再取反,正数不变。
6、由补码求反码:负数先减一再取反,正数不变。
通过以上口诀,可以方便快捷地进行原码、反码、补码的转换计算,尤其是在计算机编程过程中,我们需要进行多次的码制转换,这些计算口诀可以帮助我们减少出错的可能性,提高编程的效率和准确性。
综上所述,“原码反码补码计算口诀”对于学习计算机相关知识的人来说是非常重要的,我们需要掌握这些概念和转换口诀,以便能够快速准确地进行相关的计算。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
C语言中,原码,补码和反码怎么换算?
原码、反码、补码都是有符号定点数的表示方法。
一个有符号定点数的最高位为符号位,0是正,1是副。
以下都以8位整数为例,
原码就是这个数本身的二进制形式。
例如
1000001 就是-1
0000001 就是+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位原码能表示的数多一个。