[补充]原码、反、补、移码的转换

近期在学习Java的类型转换的知识,强制类型转换的时候会遇到数据(丢失)溢出的问题。

最后在IDEA控制台输出的时候,出现了负数。了解了一下强制类型转换在计算机中的原理,随后就复习了一下原码、反、补、移码的转换的知识。

[重点]强制类型转换在计算机中的执行原理

可以看到,我们int类型转换为byte类型,在2^8=128的二进制数范围内,不会造成数据(丢失)溢出。

但是当我们强制类型转换的时候,大范围的数据类型的数据,大于小范围数据类型的表示范围的时候,会造成精度损失(数据丢失/溢出)。

  • 举例:

    我们可以看到,最终的结果是-36负数

    int i = 1500;//     00000000 00000000 00000101 11011100
    byte j = (byte) i;//                        11011100
    System.out.println(j);

截断为byte后,保留最低8位11011100

符号位判断:11011100,最高位是1,那么是负数。

补码转十进制 取反+1 得到-36原码。

  • 负数在计算机中存储是补码存储的。

  • 补码—取反+1—>原码

以下是补充知识:

原码、反、补、移码的转换

编码类型定义用途
原码符号位(最高位) + 绝对值二进制(0表示正,1表示负)人类直观理解的二进制表示
反码原码符号位不变,其他位取反早期计算机的数值表示
补码反码 + 1(或原码符号位不变,其他位取反后+1)现代计算机统一使用补码,解决加减法统一性问题
移码补码符号位取反(或原码偏移 2^(n-1)}浮点数的指数部分,方便比较大小

转换规则表(以数字 +5-5 为例)

数值原码反码补码移码(偏移128)
+50000 01010000 01010000 01011000 0101
-51000 01011111 10101111 10110111 1011

转换流程详解

1. 原码 → 反码
  • 正数:反码 = 原码

  • 负数:符号位不变,其他位取反 -5 原码:1000 0101 → 反码:1111 1010

2. 原码 → 补码
  • 正数:补码 = 原码

  • 负数:符号位不变,其他位取反后 +1 -5 原码:1000 0101 → 取反:1111 1010 → 补码:1111 1010 + 1 = 1111 1011

3. 补码 → 原码
  • 正数:原码 = 补码

  • 负数:符号位不变,其他位取反后 +1 -5 补码:1111 1011 → 取反:1111 1011 → 1000 0100 → +1:1000 0101(原码)

4. 补码 → 移码
  • 规则:补码符号位取反 -5 补码:1111 1011 → 移码:0111 1011


关键特性对比

特性原码补码移码
0的表示0000 00001000 0000唯一:0000 0000唯一:1000 0000
数值范围-127 ~ +127-128 ~ +127-128 ~ +127(偏移后)
加减法运算需要处理符号位直接二进制加减不用于算术运算
硬件实现复杂简单(统一加减法)用于浮点数指数比较

总结

  • 补码是计算机存储整数的标准方式,解决了“加减法统一性”问题。

  • 移码通过偏移值(如 +128)让所有数值的符号位为 01,方便浮点数指数比较。

  • 原码/反码仅用于理论理解,实际计算中已被补码取代。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值