简单易学的二进制源码、反码、补码,不懂的快看过来
发布网友
发布时间:2022-12-30 15:18
我来回答
共1个回答
热心网友
时间:2023-10-30 19:46
二进制在计算机技术中广泛应用。二进制数用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相关技术文章或行业资讯
欢迎大家关注和转发文章,后期还有福利赠送!