Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么二进制等价计算变得不正确?_C++_Binary - Fatal编程技术网

C++ 为什么二进制等价计算变得不正确?

C++ 为什么二进制等价计算变得不正确?,c++,binary,C++,Binary,我编写了下面的程序来输出一个整数的二进制等价物(我检查了我的系统中int是4字节),它是4字节。但结果并不正确。代码是: #include<iostream> #include<iomanip> using namespace std; void printBinary(int k){ for(int i = 0; i <= 31; i++){ if(k & ((1 << 31) >> i))

我编写了下面的程序来输出一个整数的二进制等价物(我检查了我的系统中int是4字节),它是4字节。但结果并不正确。代码是:

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

void printBinary(int k){
    for(int i = 0; i <= 31; i++){
        if(k & ((1 << 31) >> i))
            cout << "1";
        else 
            cout << "0";
    }
}

int main(){
    printBinary(12);
}
#包括
#包括
使用名称空间std;
无效打印二进制文件(int k){
对于(int i=0;i i))

cout问题在于
1此表达式不正确:

if(k & ((1<<31)>>i))
要解决此问题,请将表达式替换为
1&(k>>(31-i))
。这样可以避免将
1
移动到符号位位置而导致的未定义行为*


*因此,在32位
int
中向左移动
1
31次不再是未定义的(感谢Matt McNabb指出这一点)。

带符号整数值的典型内存表示形式如下所示:

mosts重要的b它(从右开始)是符号位,在
有符号数字
(如
int
)中,它表示数字是否为负数。 移位附加位时,将执行符号扩展以保留数字的符号。通过将数字附加到数字的最高有效边来实现这一点。(根据所使用的特定符号数字表示,遵循一个过程)。
在无符号数中,右侧的第一位仅为所表示数的MSB,因此,当您移动其他位时,不会执行符号扩展

注意:位的枚举从0开始,因此
1>
导致符号扩展。(正如@dasblinkenlight所指出的)


因此,问题的简单解决方案是使数字不带符号(这就是
U
1U中所做的,虽然从技术上讲,它正确地解释了指令是如何在机器上执行的,但语言标准没有定义
1@nhahdh的行为,这就是为什么我写这是OP系统上的行为。我认为你应该让它更加突出,并澄清fact表示,虽然您的修复在OP的系统上可能是正确的,但根据规范,它是未定义的行为。没有UB@MattMcNabb我不认为这个标记是C++14@MattMcNabb:你的措辞听起来像是想表明余浩是不正确的。我的意思是,他不是,因为OP没有说明具体的版本。@Zaibis他是不正确的目前的C++版本。我想提供更多的信息。@ MtMcNabab:我试图防止未来读者的困惑。所以我说我们做得很好,我的朋友;你没有提供实际发生的事情,你没有想到什么是+。+为什么你可以告诉我们你认为什么是错的?如果你不告诉我们什么让你困惑,很难告诉你哪里出了问题……Zaibis,它是2015。C++是C++ 14,除非另有说明。(流行)编译器使用C++03以外的东西作为默认值?
80000000 // 10000...00
C0000000 // 11000...00
E0000000 // 11100...00
F0000000 // 11110...00
F8000000
FC000000
...
FFFFFFF8
FFFFFFFC
FFFFFFFE // 11111..10
FFFFFFFF // 11111..11