【深入浅出-JVM】(2):原码、反码、补码

本文主要介绍计算机中补码、原码、反码的相关知识。阐述了用补码表示 0 的情况,说明了补码、原码、反码之间的转换规则,对比了它们表示数值的范围,还介绍了左移、右移、无符号右移等常用概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

计算机中有补码表示 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

数值
原码
反码
补码
00000 00000000 00000000 0000
-01000 00001111 11110000 0000

补码、原码、反码转换

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

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

区别:

  1. 8位二进制, 使用原码或反码表示的范围为[-127, 127], 而使用补码表示的范围为[-128, 127].
    补码可以多表示一个范围,其实是利用补码 10000000 的原码是 = -128
  2. 原码最大的问题就是 一个数加上他的相反数不等于 0
  3. 已知补码,求原码的负数的补码:符号位和数值位都取反,末位再加1

补码

常用概念

  • 左移
    左移的规则只记住一点:丢弃最高位(符号位),0补最低位
  • 右移
    左边空出的位用0或者1填补。正数用0填补,负数用1填补。注:不同的环境填补方式可能不同;
    低位右移溢出则舍弃该位。
  • 无符号右移
    左边空出的位用0填补,低位右移溢出则舍弃该位。

---

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

作 者 : @mousycoder

原文出处 : http://mousycoder.com/thinking-in-jvm/2/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值