负数和大数按位排列

时间:2019-02-04 17:37:19

标签: c++

我开始学习C ++,但有一个我根本不了解的问题。 我有一个接收int的程序:ex:二进制中的“ 1”是:00000001,为什么当我使用以下公式时什么也没发生:“ 00000001 | =(1u << -1 )”?它只是返回00000001。 而另一个问题是当我尝试以下公式时:“ 00000001 | =(1u << 64 )” ..

非常感谢!

这是我的代码:

#include <iostream>
#include <bitset>
#include "setbit.h"
#include "resetbit.h"
#include "getbit.h"

using namespace std;

int setBit(int decimal, int bit)
{
int val =  decimal |= (1u << bit);
return val;
}

int main()
{
cout << "Int: " << endl;
    int decimal;
        cin >> decimal;

std::string firstBinary = std::bitset<8>(decimal).to_string(); //to binary
cout << "Binary: " << firstBinary << endl;

cout << "Select bit: " << endl;
    int bit;
        cin >> bit;

int dec_setBit = setBit(decimal, bit);
cout << "Dec: " << dec_setBit << endl;

std::string bin_setBit= std::bitset<8>(dec_setBit).to_string(); //to binary
cout << "Binary " << bin_setBit << endl;



return 0;
}

1 个答案:

答案 0 :(得分:0)

此代码违反了移位运算符的语言定义中的非要求:“如果右操作数为负,或者大于或等于提升后的左操作数的位长度,则该行为未定义。” [expr.shift] / 1。

因此1u << -1会产生未定义的行为,对于64位或更小的整数类型,1u << 64也会这样做。

实际上,这意味着当您编写该代码时,最终将由硬件使用这些值来完成,而这些值可能是您想要的,也可能不是。

之所以不需要,是因为移位操作最简单地实现为直接硬件指令,并且移位值超出范围的硬件移位指令的效果取决于硬件。施加明确的要求将意味着某些硬件平台的实现将必须检查正确的操作数的值,以避免产生与要求不同的特定于硬件的结果。由于超出范围的转换通常是无用的,因此(早在C统治丛林时,)就决定了语言定义对此没有要求。