源码0是正
1. 二进制的原码、补码、反码详解
计算机中,并没有原码和反码,只是使用补码,代表正负数。
使用补码的意义:可以把减法或负数,转换为加法运算。从而简化计算机的硬件。
------------
比如钟表,时针转一圈,周期是 12 小时。
倒拨 3 小时,可以用正拨 9 小时代替。
9,就称为-3 的补数。
计算方法:12-3 = 9。
对于分针,倒拨 X 分,就可以用正拨 60-X 代替。
------------
如果,限定了两位十进制数 (0~99),周期就是 100。
那么,减一,就可以用 +99 代替。
24-1 = 23
24 + 99 = (1) 23
忽略进位,只取两位数,这两种算法,结果就是相同的。
于是,99 就是 -1 的补数。
其它负数的补数,大家可以自己求!
求出了负数的补数,就可用加法,代替减法了。
------------
计算机中使用二进制,补数,就改称为【补码】。
常用的八位二进制是:0000 0000~1111 1111。
它们代表了十进制:0~255,周期就是 256。
那么,-1,就可以用 255 = 1111 1111 代替。
所以:-1 的补码,就是 1111 1111 = 255。
同理:-2 的补码,就是 1111 1110 = 254。
继续:-3 的补码,就是 1111 1101 = 253。
。。。
最后:-128,补码是 1000 0000 = 128。
计算公式:负数的补码=256+这个负数。
正数,直接运算即可,不需要求补码。
也可以说,正数本身就是补码。
------------
补码的应用如: 7-3 = 4。
用补码的计算过程如下:
7 的补码=0000 0111
-3的补码=1111 1101
--相加-------------
得:(1) 0000 0100 = 4 的补码
舍弃进位,只保留八位,作为结果即可。
这就是:使用补码,加法就代替了减法。
所以,在计算机中,有一个加法器,就够用了。
原码和反码,都没有这种功能。
------------
原码和反码,毫无用处。计算机中,根本就没有它们。
2. +0或者-0的源码、反码、补码分别是什么补码是一样的吗
整数(正整数、负整数、零),是以各种代码,存入计算机的。
要知道,天下,只有一个零。
零,既不是正数,也不是负数。这可是小学的知识。
但是,计算机砖家,硬在零上强加了一个符号位!
于是,在原码反码中,就都为一个零,编造了正负两个代码。
零的原码,有两个:0000 0000、1000 0000。
反码,也是两个:0000 0000、1111 1111。
这些砖家,这就是要“上天”哪!
-------------------
原码和反码,都是重复定义了“零的编码”,这就造成了混乱。
而且,零多占用一组代码,那么,所能表示的数字,必然就少一个。
因此,八位的原码反码,都不能表示-128。
这就导致了:【原码和反码,计算机都无法使用】。
所以,在计算机系统中,数值,一律采用补码来表示和存储。
-------------------
补码的理论,来源于数学的规律,并非是人为的胡编乱造。
0 的八位补码,只有一个,就是:0000 0000。
零,在补码中,只用唯一的一组代码来表示,这就不会产生混乱。
--------------------
求补码,书上介绍的方法,就是:取反加一。
但是,原码反码中,都是没有 0 和-128。
(虽然原码反码都有 +0 和-0,但是它们毕竟不是 0。)
谁再想用“取反加一”,就要 Duang、Duang 的碰壁了。
--------------------
那么,0 和-128 的补码,都是怎么求出来的?
补码,有自己的定义式,与原码反码,并无关系。
这定义式,是由数学理论推导出来的,要比胡说八道的“取反加一”更准确严密。
当 X >= 0: [ X ]补码 = X;
当 X < 0: [ X ]补码 = X + 2^n, n 是补码的位数。
按照定义式,0 和-128 的八位补码,都可以求出来了。
[ 0 ]补码 = 0000 0000。
[-128]补码 = -128 + 2^8 = 128 = 1000 0000 (二进制)。
--------------------
如果按照“取反加一”,零的补码,也将是“负零的反码+1”。
那么,[-0 ]补码,就是:0000 0000!
发现有点诡异呀?
-0,不是负数吗?其补码的符号位。怎么是(0)正的!
哪位计算机砖家来解释解释。。。
3. +0或者-0的源码、反码、补码分别是什么补码是一样的吗
0原码是00000000
-0原码是10000000
0反码是00000000
-0反码是11111111
0补码是00000000
补码没有正0与负0之分
正数的反码、补码和其原码相同负数的反码是其原码除符号位外其他位取反负数的补码是取其反码后加1
4. +0或者-0的源码、反码、补码
[+0]原码=0000 0000, [-0]原码=1000 0000
[+0]反码=0000 0000, [-0]反码=1111 1111
[+0]补码=0000 0000, [-0]补码=0000 0000
补码没有正0与负0之分。正数的反码、补码和其源码相同,负数的反码是其源码,除符号位外其他位取反负数的补码是取其反码后加1。
详细释义:
所谓原码就是二进制定点表示法,即最高位为符号位,“0”表示正,“1”表示负,其余位表示数值的大小。
(一)反码表示法规定:
1、正数的反码与其原码相同;
2、负数的反码是对正数逐位取反,符号位保持为1;
(二)对于二进制原码10010求反码:
((10010)原)反=对正数(00010)原含符号位取反= 反码11101 (10010,1为符号码,故为负)
(11101) 二进制= -2 十进制
(三)对于八进制:
举例 某linux平台设置了默认的目录权限为755(rwxr-xr-x),八进制表示为0755,那么,umask是权限位755的反码,计算得到umask为0022的过程如下:
原码0755= 反码 0022 (逐位解释:0为符号位,0为7-7,2为7-5,2为7-5)
(四)补码表示法规定:正数的补码与其原码相同;负数的补码是在其反码的末位加1。
(4)源码0是正扩展阅读
转换方法
由于正数的原码、补码、反码表示方法均相同,不需转换。在此,仅以负数情况分析。
(1) 已知原码,求补码。
例:已知某数X的原码为10110100B,试求X的补码和反码。
解:由[X]原=10110100B知,X为负数。求其反码时,符号位不变,数值部分按位求反;求其补码时,再在其反码的末位加1。
1 0 1 1 0 1 0 0 原码
1 1 0 0 1 0 1 1 反码,符号位不变,数值位取反
1 +1
1 1 0 0 1 1 00 补码
故:[X]补=11001100B,[X]反=11001011B。
(2) 已知补码,求原码。
分析:按照求负数补码的逆过程,数值部分应是最低位减1,然后取反。但是对二进制数来说,先减1后取反和先取反后加1得到的结果是一样的,故仍可采用取反加1 有方法。
例:已知某数X的补码11101110B,试求其原码。
解:由[X]补=11101110B知,X为负数。
采用逆推法
1 1 1 0 1 1 1 0 补码
1 1 1 0 1 1 0 1 反码(末位减1)
1 0 0 1 0 0 1 0 原码(符号位不变,数值位取反)
5. 什么是源码,反码,补码
这三个都是二进制数,如果源码是正的,那么反码,补码都是和源码是一样的,如果源码是负的话,其中最高位是符号位,1表示负,0表示正。比如-15,它的源码是10001111,反码就是把源码的0和1互换位置,其中符号位不变。-15的反码是11110000,补码就是在反码的基础上末尾加1就行了
6. 简单易学的二进制源码、反码、补码,不懂的快看过来
二进制在计算机技术中广泛应用。二进制数用0和1两个数字及其组合来表示任何数,二进制的进位规则是:“逢2进1”。数字1在不同的位上代表不同的值,按从右至左的次序,这个值以2倍递增。
在计算器中参与运算的数有两大类:无符号数和有符号数
对于有符号数而言,符号的正、负机器是无法识别的,但由于“正、负”恰好是两种截然不同的状态,如果用“0”表示“正”,用“1”表示“符”,这样符号也被数字化了,
并且规定将它放在有效数字的前面,即组成了有符号数。所以,在二进制中使用最滚键高位(第一位)来表示符号,最高位是0,表示正数;最高位是1,表示负数。
无符悔枣号数是针对二进制来讲的,无符号数的表数范围是非负数。全部二进制均代表数值(所有位都用于表示数的大小),没有符号位。即第一个"0"或"1"不表示正负。
例子:
在二进制系统中是以bit(位)来作为数据存储单元的(详细内容请看前言)碧备拆,假设 int number = 1 ,那么number在计算机系统中将表示如下:
00000000 00000000 00000000 00000001
同理可得,number=-1 时,在二进制中表示如下:
10000000 00000000 00000000 00000001
注意:最高位(第一位)是符号位,因为是number值为1是一个正数,所以最高位为0;
要从右到左用二进制的每个数去乘以2的相应次方(次方要从0开始算起);
假如:二进制数1101转化成十进制 ,那么 1101 = 1*20+0*21+1*22+1*23 = 1+0+4+8 = 13;
注意:任何数的0次方都是1。
对于有符号数而言:
二进制的最高位是符号位:0表示正数,1表示负数
正数的原码、反码、补码都一样;
负数的反码 = 它的原码符号位不变,其他位取反(0 ->1 ; 1->0 );
负数的补码 = 它的反码 +1;
0的反码、补码都是0;
在计算机运算的时候,都是以补码的方式来运算的;
例子:
下面我们就使用“有符号数”来模拟一下,在计算机中是怎样运算的。
例如:1+1 ,在计算机中运算如下:
1的原码为:
00000000 00000000 00000000 00000001
因为“正数的原码、反码、补码都一样”,所以,1的补码 = 1的原码,所以 1的补码+ 1的补码 就等于:
00000000 00000000 00000000 00000001
+
00000000 00000000 00000000 00000001
=
00000000 00000000 00000000 00000010
00000000 00000000 00000000 00000010( 转换为10进制) = 0*2^0 + 1*2^1 = 0 + 2 =2
例如:1-2,在计算机中运算如下:
在计算机中减运算其实是作为加运算来操作的,所以,1-2 = 1 + ( -2 )
第一步: 把 1补码找出来(因为正数的原码、反码、补码都一样,所以我们可通过原码直接获取补码):
1的补码:
00000000 00000000 00000000 00000001
第二步: 把-2的原码找出来:
-2的原码:
10000000 00000000 00000000 00000010
第三步: 把-2的反码找出来:
-2的反码:
11111111 11111111 11111111 11111101
第四步: 把-2的补码找出来:
-2的补码:
11111111 11111111 11111111 11111110
第五步: 1的补码与-2的补码相加:
00000000 00000000 00000000 00000001
+
11111111 11111111 11111111 11111110
=
11111111 11111111 11111111 11111111
第六步: 将计算结果的补码转换为原码,反其道而行之即可(如果想将二进制转换为十进制,必须得到二进制的原码)
补码:11111111 11111111 11111111 11111111
=
反码:11111111 11111111 11111111 11111110
=
原码:10000000 00000000 00000000 00000001
第七步: 将计算结果的二进制原码 转换 为十进制
二进制原码:10000000 00000000 00000000 00000001 = 1*2^0 = -1
java中所有的数字变量都是有符号(正负)的?
这句话,还有点争议。在Java中char类型是:16位Unicode字符,取值范围 0 ~ 65535 , 不存在负数范围,从这点上说:"char类型就是一个无符号数";
1.正数的原码、反码、补码都一样;
2.如果想将 二进制 转为 十进制,必须使用 二进制的原码;
感谢你看到这里,我是 程序员麦冬 ,一个java开发从业者,深耕行业六年了,每天都会分享java相关技术文章或行业资讯
欢迎大家关注和转发文章,后期还有福利赠送!
7. +0或者-0的源码、反码、补码
[+0]原码=0000 0000, [-0]原码=1000 0000
[+0]反码=0000 0000, [-0]反码=1111 1111
[+0]补码=0000 0000, [-0]补码=0000 0000
补码没有正0与负0之分。正数的反码、补码和其源码相同,负数的反码是其源码,除符号位外其他位取反负数的补码是取其反码后加1。
详细释义:
所谓原码就是二进制定点表示法,即最高位为符号位,“0”表示正,“1”表示负,其余位表示数值的大小。
(一)反码表示法规定:
1、正数的反码与其原码相同;
2、负数的反码是对正数逐位取反,符号位保持为1;
(二)对于二进制原码10010求反码:
((10010)原)反=对正数(00010)原含符号位取反= 反码11101 (10010,1为符号码,故为负)
(11101) 二进制= -2 十进制
(三)对于八进制:
举例 某linux平台设置了默认的目录权限为755(rwxr-xr-x),八进制表示为0755,那么,umask是权限位755的反码,计算得到umask为0022的过程如下:
原码0755= 反码 0022 (逐位解释:0为符号位,0为7-7,2为7-5,2为7-5)
(四)补码表示法规定:正数的补码与其原码相同;负数的补码是在其反码的末位加1。
(7)源码0是正扩展阅读
转换方法
由于正数的原码、补码、反码表示方法均相同,不需转换。在此,仅以负数情况分析。
(1) 已知原码,求补码。
例:已知某数X的原码为10110100B,试求X的补码和反码。
解:由[X]原=10110100B知,X为负数。求其反码时,符号位不变,数值部分按位求反;求其补码时,再在其反码的末位加1。
1 0 1 1 0 1 0 0 原码
1 1 0 0 1 0 1 1 反码,符号位不变,数值位取反
1 +1
1 1 0 0 1 1 00 补码
故:[X]补=11001100B,[X]反=11001011B。
(2) 已知补码,求原码。
分析:按照求负数补码的逆过程,数值部分应是最低位减1,然后取反。但是对二进制数来说,先减1后取反和先取反后加1得到的结果是一样的,故仍可采用取反加1 有方法。
例:已知某数X的补码11101110B,试求其原码。
解:由[X]补=11101110B知,X为负数。
采用逆推法
1 1 1 0 1 1 1 0 补码
1 1 1 0 1 1 0 1 反码(末位减1)
1 0 0 1 0 0 1 0 原码(符号位不变,数值位取反)
8. 0的原码,补码,反码是什么
0在计算机种分+0与-0,它们的原码,补码,反码如下:
1、[+0]原码=0000 0000, [-0]原码=1000 0000;
2、[+0]反码=0000 0000, [-0]反码=1111 1111;
3、[+0]补码=0000 0000, [-0]补码=0000 0000。
在这里你会发现,+0和-0的补码是一样的,即0的补码只有一种表示。
在计算机内,符号数有3种表示法:原码、反码和补码。
(8)源码0是正扩展阅读:
原码、补码、反码的转换规则:
1、原码的求法:
(1)对于正数,转化为二进制数,在最前面添加一符号位(这是规定的),用1表示负数,0表示正数,如:0000 0000是一个字节,其中左边第一个0,0为符号位,表示是正数,其它七位表示二进制的值。
(2)正数的原码、反码、补码是同一个数。
(3)对于负数,转化为二进制数,前面符号位为1,1表示是负数。
2、计算原码只要在转化的二进制数前面加上相应的符号位就行了。
3、反码的求法:
对于负数,将原码各位取反,符号位不变。
4、补码的求法:
对于负数,将反码加上二进制的1即可,也就是反码在最后一位上加上1就是补码了。
9. C语言源码生成目标文件后的二进制码是原码,反码,还是补码
当然是补码了。计算机中所有的表示都是用补码。因为正数的补码就是它陪亩本身,所以正数在内存中既是原码也是补码,芦嫌森负数肯定是补码了哦。所以都是补码。
你说的”反码和原码只用了介绍补码为什么出现,实际上已经不用了?“是因为为了引出补码的概念和利用反码和原码如何求补码,所以就介绍了反码和原码。对于负数
补码=取反+1;
所以原码=取反(补码-1)
你看反码是补码和原码之间的联系,介绍它就是为了计算
对于正数,补码=原码=本身者禅,也是为了求补码
10. 十进制的原码、补码
十进制-67的原码是01000011、反码是10111100和补码是10111101。
转换规则:
1、负整数的原码为二进制前面加符号位;
-67=1000011(二进制)=11000011(原码)
2、负整数的反码=原码各位取反(除了符号位外);
11000011(原码)=10111100(反码)
3、负整数的补码=负整数的反码+00000001;
10111100(反码)=10111101(补码)
(10)源码0是正扩展阅读:
已知一个数的补码,求原码的操作其实就是对该补码再求补码:
⑴如果补码的符号位为“0”,表示是一个正数,其原码就是补码。
⑵如果补码的符号位为“1”,表示是一个负数,那么求给定的这个补码的补码就是要求的原码。
例:已知一个补码为11111001,则原码是10000111(-7)。
因为符号位为“1”,表示是一个负数,所以该位不变,仍为“1”。
其余七位1111001取反后为0000110;再加1,所以是10000111。