先上图:
总之:
数的绝对值二进制展开------------------>原码
原码按位取反------------------------------>反码
反码+1--------------------------------------->补码
负数的二进制是补码形式,正数的二进制是原码形式。
正数首位为0,负数首位为1。
习题:
我们知道byte的数据范围在-128~127之间。执行以下运算,输出是多少?
int x=126;
byte y=4;
y=(byte)(x+y);
解析:
假设y为int型,则130未超出int的正值范围,则会输出130.但130超出了byte的正值范围,故而不会输出正值130,而是输出一个负数。那输出是多少呢?我们可以将130二进制展开:1000 0010,我们知道首位为1表示负数,而负数的二进制展开是补码形式的,补码减一得到反码:1000 0001。反码按位取反得到原码:0111 1110。这个二进制即是输出的负数绝对值的原码。由原码可知该负数的绝对值为126,故正确的输出结果为-126;
130---->1000 0010 得补码
补码减1---->1000 0001 得反码
反码取反---->0111 1110 得绝对值原码
0111 1110--->126 得绝对值
126-------> -126 得正确输出