zoukankan      html  css  js  c++  java
  • 【深入浅出-JVM】(2):原码、反码、补码

    计算机中有补码表示 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
    2. 原码最大的问题就是 一个数加上他的相反数不等于 0
    3. 已知补码,求原码的负数的补码:符号位和数值位都取反,末位再加1

    补码

    常用概念

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

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

    作 者 : @mousycoder

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

    我是浩哥,希望我的思考能帮到您!
  • 相关阅读:
    在手机浏览器中判断App是否已安装
    用git无法连接github的解决方法
    使用pdf.js显示pdf文件
    Javascript绝句欣赏
    HTTP Keep-Alive模式
    和浏览器并发请求数有关的一些前端技术
    Javascript标准参考教程学习记录
    [nodejs]国内npm安装nodejs modules失败的几个解决方案
    利用sfntly的sfnttool.jar提取中文字体
    Bzoj4378--Poi2015Logistyka
  • 原文地址:https://www.cnblogs.com/mousycoder/p/11188892.html
Copyright © 2011-2022 走看看