美文网首页
python中的原码反码和补码

python中的原码反码和补码

作者: wanzhouyi | 来源:发表于2021-05-29 00:17 被阅读0次

    python中的原码反码和补码

    原码反码和补码的概念

    1. 原码:原码是二进制数字的一种简单的表示法。二进制首位为符号位,1代表负,0代表正。
    2. 反码:反码可由原码得到。如果是正数,反码与原码相同;如果是负数,反码是其原码(符号位除外)各位取反而得到的。
    3. 补码:补码可由原码得到。如果是正数,补码与原码相同;如果是负数,补码是对其原码(除符号位外)各位取反,并在末位加1而得到的(有进位则进位,但不改变符号位)。

    更详细的介绍可参考这篇文章

    原码反码和补码的示例

    如下以8位二进制为例:

    真值 原码 反码 补码 备注
    2^7-1=127 0 1111111 0 1111111 0 1111111 正数的原码反码补码相同
    + 7 0 0000111 0 0000111 0 0000111 正数的原码反码补码相同
    + 1 0 0000001 0 0000001 0 0000001 正数的原码反码补码相同
    0 0 0000000 0 0000000 0 0000000 正数的原码反码补码相同
    - 1 1 0000001 1 1111110 1 1111111 负数的补码是符号位不变其余取反加 1
    - 7 1 0000111 1 1111000 1 1111001 负数的补码是符号位不变其余取反加 1
    −(2^7−1)=−127 1 1111111 1 0000000 1 0000001 负数的补码是符号位不变其余取反加 1

    特殊地数字在计算机中用二进制补码形式表示,补码10000000表示的不是 -0,而是-128

    python中的原码反码及补码

    一般来讲,整形数在内存中是以 补码 的形式存放的,输出的时候同样也是按照 补码 输出的。

    但是在 Python 中,情况是这样的:

    1. 整形是以 补码 形式存放的,输出的时候是按照 二进制 表示输出的;
    2. 对于 bin(x)(x为 十进制负数),输出的是它的原码的二进制表示加上一个负号,方便查看
    3. 对于 bin(x)(x 为 十六进制负数),输出的是对应的二进制表示。

    所以为了获得十进制负数的补码,我们需要手动将其和 0xffffffff 进行与操作,得到一个十六进制数,再交给 bin() 转化,这时内存中得到的才是你想要的补码。

    a = bin(-3)
    print(a)
    
    a = bin(3)
    print(a)
    
    b = bin(-3 & 0xffffffff)
    print(b)
    
    c = bin(0xfffffffd)
    print(c)
    
    # 输出
    # -0b11
    # 0b11
    # 0b11111111111111111111111111111101
    # 0b11111111111111111111111111111101
    

    相关文章

      网友评论

          本文标题:python中的原码反码和补码

          本文链接:https://www.haomeiwen.com/subject/bpzesltx.html