gpt4 book ai didi

python - 如何强制编译器或解释器查看二进制数的二进制补码?

转载 作者:行者123 更新时间:2023-11-30 00:49:00 25 4
gpt4 key购买 nike

这是一个简单的C++程序:

#include <iostream>
#include <string>
using namespace std;

int main()
{
int x=0b10000001;
cout<<"Your number is :"<<x;
}

输出:

Your number is : 129

这也是它的 Python 对应物:

>>> i=0b10000001
>>> print i
129
>>>

我想知道,如何强制 C 编译器或 Python 解释器将我的变量视为二进制补码并打印 -127 而不是 129

我可以编写一个函数来做我想做的事(即检查最高有效位并打印所需的值),但我想知道,数字在何处表现为二进制补码,以及它们在编程中何时表现为普通二进制值?

问题是:

什么时候二进制变量表现为二进制补码,什么时候表现为普通二进制数?

最佳答案

我知道的最简单的非强制转换方式:

i = i - 2*(i & (1 << 7))

其中 i 是至少足以满足您的目标值的任何整数类型,其中 7 应替换为符号位的位置(7 表示 8-位数,16 位数为 15,等等)。

之所以可行,是因为带符号整数中的符号位最好被解释为其常用值的负数。例如,一个 8 位数字的符号位表示 -128,而不是 +128。这段代码基本上是减去符号位值的两倍,将 +128 变成 -128。

Python 示例:

>>> i = 129
>>> i = i - 2*(i & (1 << 7))
>>> i
-127

在编程时,值的类型 决定了该值的位模式将如何被程序解释。无符号值解释没有任何符号位的位模式(因此值不能为负),而有符号值用符号位(二进制补码)解释它。在 C 中,符号位是固定宽度整数的最高有效位。通过强行将值强制转换为更小的大小,您可以更改哪个位被视为符号位;这就是打印的原因

(signed char)129

在 C 中会给你 -127。

请注意,Python 没有内置的无符号类型;所有整数都是有符号的,但它们可以是任意大的(不像 C,整数被限制在特定的位数中)。因此,我的回答向您展示了如何在不使用转换的情况下获得带符号的值;它适用于 C 和 Python。

关于python - 如何强制编译器或解释器查看二进制数的二进制补码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30046876/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com