-1

我知道这个主题有很多主题,但没有一个能帮助我解决我的问题。我在 Code::Blocks 上工作(在“属性>项目构建选项>编译器设置>其他选项”中使用选项 -std=c99)并且以下代码没有给出预期的输出:

long long val=1<<33;
printf("value: %llu",val);

事实上,我在终端中获得了“值:0”。我该如何解决这个问题?

当我写 30 而不是 33(所以 val 是一个整数)时,我得到了正确的答案。我也尝试过 %lld 但这没有帮助。

4

3 回答 3

3

由于您没有以任何方式限定文字 1 和 33,1<<33因此将具有 anint作为其类型。如果int是 32 位(在针对 64 位的编译器上很常见),那么这个表达式将产生未定义的行为

一个简单的解决方法是编写1LL << 33. 1LL是 a long long,并且 33 也将被提升为该类型。C++ 标准保证至少为long long64位。

在很多方面,虽然我更喜欢static_cast<std::int64_t>(1) << 33.

于 2015-03-18T16:50:07.973 回答
3

1<<33将为 32 位调用未定义的行为int

C11:6.5.7 移位运算符:

的结果E1 << E2E1左移的E2位位置;空出的位用零填充。如果E1具有无符号类型,则结果的值为 ,以E1 × 2E2比结果类型中可表示的最大值大一为模减少。如果E1具有带符号类型和非负值,并且E1 × 2E2可以在结果类型中表示,那么这就是结果值;否则,行为是 undefined

于 2015-03-18T16:47:17.250 回答
1

转换1<<33不是在long long类型上完成的。1是这里int;将其转换为long long或后缀LL,例如1LL << 33.

于 2015-03-18T16:50:08.500 回答