【发布时间】:2015-05-05 07:39:11
【问题描述】:
这是一个简单的C++程序:
#include <iostream>
#include <string>
using namespace std;
int main()
{
int x=0b10000001;
cout<<"Your number is :"<<x;
}
输出:
您的号码是:129
这也是它的 Python 对应物:
>>> i=0b10000001
>>> print i
129
>>>
我想知道,如何强制 C 编译器或 Python 解释器将我的变量视为二进制补码并打印 -127 而不是 129?
我可以编写一个函数来做我想做的事(即检查最高有效位并打印所需的值),但我想知道,数字在哪里表现为二进制补码,以及它们在编程中何时表现为普通二进制值?
问题是:
二进制变量何时表现为二进制补码,何时表现为普通二进制数?
【问题讨论】:
-
使用
signed char代替int? (假设您的设备以这种方式工作) -
呃,在 C/C++ 中,您必须跳过几圈。将其设为
signed char,然后将其转换为int即可。顺便说一句,你的二进制补码不是-1,而是-127。 -
@deviantfan 很好。我将
x定义为char/signed char并在下一行中,在打印之前将其转换为int。现在我看到-127。但问题不是“如何?”,而是“为什么?” -
@Abraham 如果变量长度为 8 位,则会发生 127+1==-128 处的溢出,但
int大于此值。它可以在溢出之前保存更大的数字。 (严格来说,尺寸取决于您的设备) -
@Aracthor 不完全是,整数字面量是,除非另有说明(使用例如后缀)类型为
int,默认情况下是有符号的。