【问题标题】:Confusion with 1's compliment binary representation [duplicate]与1的补码二进制表示混淆[重复]
【发布时间】:2021-01-01 07:00:21
【问题描述】:

我试图学习负数的二进制表示。我试图以二进制输出 12 和 ~12。

print(~12)

输出:

-13

这是 12 的 1 的补码。

但我怀疑 二进制 12 是 1100-13(12 的补码)是 00113 也是 0011二进制。这让我很困惑。

-13 和 3 如何具有相同的二进制值?

【问题讨论】:

  • 二进制中的 12 除 4 位和 8 位外全为零。二进制中的-13全1,除了那些位。这不是0011。这是11...110011
  • 请注意,~ 不是 1 的补码。定义为~x == -(x+1),匹配任意精度2的补码。
  • @S3DEV 否。二进制——作为一个位序列——可以表示任何字面意思。不能保证 10011 是偶数,它也可以是 ASCII 字形 CR 或 UTF-8 字形的前半部分 。更进一步,从技术上讲,您必须知道字节和位字节序——10011 可能是无符号整数小字节序中的25
  • 很有道理,谢谢。

标签: python binary bit complement ones-complement


【解决方案1】:

TLDR:-13 和 3 的二进制值不同。混淆源于忽略显式符号和填充/宽度。


Python 整数表现为 unsigned 任意宽度的二进制数,带有一个 单独的 符号位。 有符号数没有通用的、明确的二进制表示。

例如,12 是数字 ...1100 和符号 +,-12 是相同的数字 ...1100 但符号 -。值得注意的是,... 可以是任意多个前导数字——110001100001100 等等都是同一个数字。这个 0-padding 允许同时处理小数和大数,例如至少 4 位 12 ...1100 可以与至少 5 位 16 ...10000 对齐。

这意味着不能有特定的前导符号位,因为每个位置前面都可以有另一个0。相反,符号位任意位于数字之前:0...1100+...1100 为 12,1...1100-...1100 为 -12。这在分隔符号和绝对值的数字的规范按位表示中是可见的。

>>> bin(12)
0b1100
>>> bin(-12)
-0b1100

因此,12 的 4 位按位补码是 -0011,而 3 是 +0011

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-21
    • 1970-01-01
    • 2011-12-18
    • 2021-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多