乐趣区

深入浅出JVM2原码反码补码

计算机中有补码表示 0

0 为正数

原码 00000000 00000000 00000000 00000000
反码 00000000 00000000 00000000 00000000    正数反码等于原码
补码 00000000 00000000 00000000 00000000    正数补码等于原码

0 为负数
原码 10000000 00000000 00000000 00000000
反码 11111111 11111111 11111111 11111111 负数反码等于原码符号位不变,其余取反
补码 00000000 00000000 00000000 00000000 负数补码等于反码 +1

用补码
1-1 = 1 + (-1) = [0000 0001] 原 + [1000 0001]原 = [0000 0001]补 + [1111 1111]补 = [0000 0000]补 =[0000 0000]原
用反码
1 – 1 = 1 + (-1) = [0000 0001] 原 + [1000 0001]原 = [0000 0001]反 + [1111 1110]反 = [1111 1111]反 = [1000 0000]原 = -0

数值 原码 反码 补码
+0 0000 0000 0000 0000 0000 0000
-0 1000 0000 1111 1111 0000 0000

补码、原码、反码转换

负数原码转补码,最高位不变,其余取反,然后 +1
10000001
11111110
11111111
负数补码转原码,最高位不变,其余取反,然后 +1 补码 -> 反码 -> 原码 -> 反码 -> 补码,(二进制数,先 - 1 再取反和先取反后 +1,结果一样)
11111111
10000000
10000001

负数反码转原码
符号位不变,其余取反
11111111
10000000

区别:

  1. 8 位二进制, 使用原码或反码表示的范围为[-127, +127], 而使用补码表示的范围为[-128, 127].

补码可以多表示一个范围,其实是利用补码 10000000 的原码是 = -128

  1. 原码最大的问题就是 一个数加上他的相反数不等于 0
  2. 已知补码,求原码的负数的补码:符号位和数值位都取反,末位再加 1

补码

常用概念

  • 左移

左移的规则只记住一点:丢弃最高位(符号位),0 补最低位

  • 右移

左边空出的位用 0 或者 1 填补。正数用 0 填补,负数用 1 填补。注:不同的环境填补方式可能不同;
低位右移溢出则舍弃该位。

  • 无符号右移

左边空出的位用 0 填补,低位右移溢出则舍弃该位。


感谢您的耐心阅读,如果您发现文章中有一些没表述清楚的,或者是不对的地方,请给我留言,您的鼓励是作者写作最大的动力。

作 者 : @mousycoder

原文出处 : http://mousycoder.com/thinkin…

退出移动版