为什么要学习原码反码补码(源码反码补码其实真的很简单)
为什么要学习原码反码补码(源码反码补码其实真的很简单)byte i = -1 对于一个负数来说:二进制原码、反码、补码是什么关系呢? 对应的二进制源码:00000000 00000000 00000000 00000001 对应的二进制反码:00000000 00000000 00000000 00000001 对应的二进制补码:00000000 00000000 00000000 00000001
1、计算机在任何情况下都只能识别二进制
2、计算机在底层存储数据的时候,一律存储的是“二进制的补码形式”,计算机采用补码形式存储数据的原因是:补码形式效率最高。
3、记住:对于一个正数来说:二进制原码、反码、补码是同一个,完全相同。
int i = 1;
对应的二进制源码:00000000 00000000 00000000 00000001
对应的二进制反码:00000000 00000000 00000000 00000001
对应的二进制补码:00000000 00000000 00000000 00000001
对于一个负数来说:二进制原码、反码、补码是什么关系呢?
byte i = -1
对应的二进制源码:10000001
对应的二进制反码(符号位不变,其它位取反):11111110
对应的二进制补码(反码 1):11111111
下面我们通过题目来练习一下,请输出以下代码打印结果:
byte b = (byte)150; System.out.println(b);
我们先通过运行程序看下结果
最终结果为-106
我们慢慢来分析下原因:
1、整数150已经超过了byte类型的取值范围,所以强转的时候会出现精度损失的情况;
2、150的二进制:00000000 00000000 00000000 10010110
3、int是4个字节,byte是1个字节,所以需要截取掉前3个字节:10010110
4、正数的源码,反码,补码都一样;现在的10010110是一个负数,所以我们要经过一轮的转换才可以得到它的源码
补码:10010110
号码:10010101
源码:11101010
11101010 = 64 32 8 2 = 106
二进制的最左边的一位代表正负数,1:负数,0:正数
所以为-106