反码补码原码问题

先上图:

 

反码补码原码问题

 

总之:

数的绝对值二进制展开------------------>原码

原码按位取反------------------------------>反码

反码+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  得正确输出