gpt4 book ai didi

c++ - 移位编译器错误或极端情况?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:21:40 25 4
gpt4 key购买 nike

以下代码输出 0,1,32,33。至少可以说这是违反直觉的。但是,如果我将文字 1 替换为类型注释常量“ONE”,则循环运行正常。

这是 gcc 4.6.2 和 -std=c++0x。

#include<iostream>
#include<cstdint>
using namespace std;
int main()
{
int64_t bitmask = 3;
int64_t k;
const int64_t ONE = 1;
cout<<"bitmask = "<<bitmask<<endl;

for(k=0; k<64; k++)
{
if(bitmask & (1<<k))
{
cout<<"k="<<k<<endl;
}
}

return 0;
}

编辑 问题: 正如 Ben 所指出的,默认情况下 1 被视为 32 位宽。当它的协操作数是 64 位时,为什么它没有提升到 64 位。

解决方案

没有。 << 不要求每一边都具有相同的类型。毕竟,当可用的最大移位适合 char 时,为什么要将右侧设为 int64_t?提升仅在处理算术运算符时发生,而不是所有运算符。

从下面比尔的评论中复制

最佳答案

这是一个问题:(1<<k) .

1是适合 int 的整数文字.

如果int在你的平台上少于 64 位,那么 (1<<k)k 时,在循环结束时会有未定义的行为很大。在您的情况下,编译器正在使用 Intel 移位指令,并且未定义的行为以 Intel 定义大于操作数大小的移位的方式出现——高位被忽略。

你可能想要 (1LL<<k)


标准的内容(第 5.8 节 expr.shift ):

The operands shall be of integral or unscoped enumeration type and integral promotions are performed. The type of the result is that of the promoted left operand. The behavior is undefined if the right operand is negative, or greater than or equal to the length in bits of the promoted left operand.

这与“The usual arithmetic conversions are performed for算术或枚举类型的操作数。”它存在于例如加法和减法运算符中。

这种语言在 C++03 和 C++11 之间没有变化。

关于c++ - 移位编译器错误或极端情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8252937/

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