Java基础-原码反码补码spa
做者:尹正杰基础
版权声明:原创做品,谢绝转载!不然将追究法律责任。计算机
注意,咱们这里举列的原码和反码只是为了求负数的补码,在计算机中没有原码,反码的存在,只有补码。数字
一.原码
1>.正数的原码就是它的自己
假设使用一个字节存储整数,整数10的原码是:0000 1010
2>.负数用最高位是1表示负数
假设使用一个字节存储整数,整数-10的原码是:1000 1010
二.反码
1>.正数的反码跟原码同样
假设使用一个字节存储整数,整数10的反码是:0000 1010
2>.负数的反码是负数的原码按位取反(0变1,1变0),符号位不变
假设使用一个字节存储整数,整数-10的反码是:1111 0101
三.补码(再次强调,整数的补码才是在计算机中的存储形式。)
1>.正数的补码和原码同样
假设使用一个字节存储整数,整数10的补码是:0000 1010(第三次强调:这一串是10这个整数在计算机中存储形式)
2>.负数的补码是负数的反码加1
假设使用一个字节存储整数,整数-10的补码是:1111 0110(第三次强调:这一串是-10这个整数在计算机中存储形式)
四.在计算机中,为何不用原码和反码,而是用补码呢?
由于在使用原码,反码在计算时不许确,使用补码计算时才准确。
1>.使用原码计算10-10
0000 1010 (10的原码)
+ 1000 1010 (-10的原码)
------------------------------------------------------------
1001 0100 (结果为:-20,很显然按照原码计算答案是否认的。)
2>.使用反码计算10-10
0000 1010 (10的反码)
+ 1111 0101 (-10的反码)
------------------------------------------------------------
1111 1111 (计算的结果为反码,咱们转换为原码的结果为:1000 0000,最终的结果为:-0,很显然按照反码计算答案也是否认的。)
3>.使用补码计算10-10
0000 1010 (10的补码)
+ 1111 0110 (-10的补码)
------------------------------------------------------------
1 0000 0000 (因为咱们这里使用了的1个字节存储,所以只能存储8位,最高位(第九位)那个1没有地方存,就被丢弃了。所以,结果为:0)
五.小试牛刀
有了上面的案例,接下来,咱们来作几个小练习吧,分别计算如下反码表示的十进制数字是多少呢?
1>.0b0000 1111
相信这个数字你们异口同声的就能说出它的答案是:15(由于正数的补码和原码同样)
2>.0b1111 1111
计算过程:0b1111 1111(补码)------>0b1111 1110(反码)------>0b1000 0001(原码)
将其换算成原码以后就能够获得最后的结果为:-1
3>.0b1111 0000
计算过程:0b1111 0000(补码)------>0b1110 1111(反码)------>0b10010000(原码)
将其换算成原码以后就能够获得最后的结果为:-16
4>.0b1000 0001
计算过程:0b1000 0001(补码)------>0b1000 0000(反码)------->0b1111 1111(原码)
将其换算成原码以后就能够获得最后的结果为:-127