8位字节表示的有符号数范围是-128~127

1  计算机中数值都是按补码来存储的。

原码(原码是带符号位的):第一位表示符号位,0表示正数,1表示负数。符号位加上真值的绝对值

比如  

   0 0 0 0   0 0 0 1  表示正1   

   1 0 0 0   0 0 0 1  表示负1

反码:正数的反码就是原码, 负数的反码是在其原码的基础上, 符号位不变,其余各个位取反(符号位不取反,数值位取反)

    0 0 0 0   0 0 0 1  表示正1   

  1 1 1 1   1 1 1 0  表示负1  

这时候就产生了一个问题,正零和负零用反码表示不一致,这样不合理

 0 0 0 0   0 0 0 0  表示正0

 1 1 1 1   1 1 1 1  表示负0

补码:正数的补码就是原码,负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1(反码+1)

 0 0 0 0   0 0 0 0  表示正0

 0 0 0 0   0 0 0 0  表示负0

这样 0 0 0 0   0 0 0 0  表示零了,正零和负零统一了

补码的好处:

统一了0的表示

符号位也可以当作数值一样参与运算

八位字节,算上符号能够表示的范围是2^8=256个数。

-128 ~ 127  正好是256个数

补码  1 0 0 0 0  0 0 0 1  求原码  ,表示的数是 - 127 

补码 1 0 0 0 0  0 0 0 0  求原码得出来的是0 0 0 0  0 0 0 0 ,这个是0的原码 。这时,人为规定补码 1 0 0 0 0  0 0 0 0 表示的值是-128 

所以 0 0 0 0   0 0 0 0  表示零

   1 0 0 0   0 0 0 0 表示-128 

---------------------------------------------------------------------

原码和补码的相互转换

正数的补码与原码相同

9的补码是 0000 1001

负数的补码 ,先得到他的原码,再得到反码+1

-15   1000 1111  ===》 1111 0000   ===》  1111  0001 

 数0的补码表示是唯一的    0000  0000 

已知补码求原码:

如果符号位是0  ,表示是一个正数,其原码就是补码

如果符号位是1  ,表示是一个负数,其原码是 符号位不变,其余位取反后加1

补码(1111 1001) 1000 0110   ==》 (原码)1000 0111 

原文地址:https://www.cnblogs.com/moris5013/p/9501037.html