原码、反码、补码计算

原码 反码 补码

于是人们开始探索 将符号位参与运算, 并且只保留加法的方法. 首先来看原码。计算十进制的表达式: 1-1=0

1 - 1 = 1 + (-1) = [00000001]+ [10000001]= [10000010]= -2

如果用原码表示, 让符号位也参与计算, 显然对于减法来说, 结果是不正确的.这也就是为何计算机内部不使用原码表示一个数.

为了解决原码做减法的问题, 出现了反码。计算十进制的表达式:

1-1=0

1 - 1 = 1 + (-1) 
= [0000 0001]+ [1000 0001] 
= [0000 0001]+ [1111 1110] 
= [1111 1111]= [1000 0000] 
= -0

发现用反码计算减法, 结果的真值部分是正确的. 而唯一的问题其实就出现在”0”这个特殊的数值上. 虽然人们理解上+0-0是一样的, 但是0带符号是没有任何意义的. 而且会有[0000 0000]原和[1000 0000]原两个编码表示0.

于是补码的出现, 解决了0的符号以及两个编码的问题:

1-1 = 1 + (-1) 
= [0000 0001]+ [1000 0001] 
= [0000 0001]+ [1111 1111] 
= [0000 0000]=[0000 0000]

这样0[0000 0000]表示, 而以前出现问题的-0则不存在了.而且可以用[1000 0000]表示-128:

(-1) + (-127) = [1000 0001]+ [1111 1111] 
= [1111 1111]+ [1000 0001] 
= [1000 0000]

-1-127的结果应该是-128, 在用补码运算的结果中, [1000 0000]补 就是-128. 但是注意因为实际上是使用以前的-0的补码来表示-128, 所以-128并没有原码和反码表示.(-128的补码表示[1000 0000]补算出来的原码是[0000 0000], 这是不正确的)

使用补码, 不仅仅修复了0的符号以及存在两个编码的问题, 而且还能够多表示一个最低数. 这就是为什么8位二进制, 使用原码或反码表示的范围为[-127, +127], 而使用补码表示的范围为[-128, 127].

因为机器使用补码, 所以对于编程中常用到的32int类型, 可以表示范围是: [-231, 231-1] 因为第一位表示的是符号位.而使用补码表示时又可以多保存一个最小值.

为什么计算机中通常使用补码的形式来表示一个数?

用补码来表示负数就可以将加减法统一成加法来运算,简化了运算的复杂程度。
采用补码进行运算有两个好处,一个就是刚才所说的统一加减法;二就是可以让符号位作为数值直接参加运算而最后仍然可以得到正确的结果符号,符号位无需再单独处理。

大数溢出问题

int类型在32位系统中占4个字节、32bit,补码表示的的数据范围为:

[10000000 00000000 00000000 00000000] ~ [01111111 11111111 11111111 11111111]

[−231,231−1]

[-2147483648, 2147483647]

Java中表示为:

[Integer.MIN_VALUE, Integer.MAX_VALUE]

byte类型的表示一样,由于负数比正数多表示了一个数字。对下限去相反数后的数值会超过上限值,溢出到下限,因此下限的相反数与下限相等;对上限去相反数的数值为负值,该负值比下限的负值大1,在可以表示的范围内,因此上限的相反数是上限直接取负值。

// 2147483647   [01111111 11111111 11111111 11111111]

System.out.println(Integer.MAX_VALUE);      

 

// -2147483648  [10000000 00000000 00000000 00000000]

System.out.println(Integer.MIN_VALUE);

 

// -2147483647      正常

System.out.println(-Integer.MAX_VALUE);     

 

// -2147483648  2147483648,超过上限,发生溢出

System.out.println(-Integer.MIN_VALUE);     

 

// true2147483648 发生溢出

// 对下限去相反数后的数值会超过上限值,溢出到下限,因此下限的相反数与下限相等

System.out.println((Integer.MIN_VALUE == -Integer.MIN_VALUE));  

猜你喜欢

转载自blog.csdn.net/qq_40016949/article/details/80207662