混淆1的补码二进制表示形式

问题描述

我正在尝试学习负数的二进制表示形式。我试图以二进制形式输出12和〜12。

print(~12)

输出:

-13

这是12的1的补码。

但是我怀疑二进制文件12是1100 -13(1的补码12)是0011 ,但是 3也是0011 二进制这对我来说很困惑。

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

解决方法

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


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

例如,12是数字...1100和符号+,而-12是相同的数字...1100但符号-。值得注意的是,...可以是任意许多前导数字-110001100001100等都是相同的数字。此0填充可将大小数字相同,例如至少4位12 ...1100可以与至少5位16 ...10000对齐。

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

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

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

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...