我知道这个主题有很多主题,但没有一个能帮我解决问题。 我处理Code :: Blocks(选项-std = c99 in&#34; Properties&gt; Project Build Options&gt; Compiler Settings&gt; Other Options&#34;),以下代码没有给出预期的输出:< / p>
long long val=1<<33;
printf("value: %llu",val);
事实上,我获得了&#34;价值:0&#34;在终端。 我该如何解决这个问题?
当我写30而不是33(所以val是一个整数)时,我得到了严格的答案。我也试过%lld,但这没有帮助。
答案 0 :(得分:3)
1<<33
将调用32位int
的未定义行为。
E1 << E2
的结果是E1
左移E2
位位置;腾出的位用零填充。如果E1
具有无符号类型,则结果的值为E1
×
2
E2
,减少模数为1结果类型中可表示的最大值。 如果E1
具有签名类型和非负值,则E1
×
2
E2
在结果中可表示type,那就是结果值;否则,行为未定义。
答案 1 :(得分:3)
由于您没有以任何方式限定文字1和33,1<<33
将有int
作为其类型。如果int
为32位(在针对64位的编译器上非常常见),则此表达式将产生未定义的行为。
一个简单的解决方法是编写1LL << 33
。 1LL
是long long
,33也会被提升为该类型。 C ++标准保证long long
至少 64位。
在很多方面,我更喜欢static_cast<std::int64_t>(1) << 33
。
答案 2 :(得分:1)
转换1<<33
未在long long
类型上完成。这里1
是int
;将其投放到long long
或使用LL
后缀,例如1LL << 33
。