无法在C中打印长整数

时间:2015-03-18 16:45:41

标签: c printf long-long

我知道这个主题有很多主题,但没有一个能帮我解决问题。 我处理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,但这没有帮助。

3 个答案:

答案 0 :(得分:3)

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

C11:6.5.7按位移位运算符:

  

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 << 331LLlong long,33也会被提升为该类型。 C ++标准保证long long 至少 64位。

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

答案 2 :(得分:1)

转换1<<33未在long long类型上完成。这里1int;将其投放到long long或使用LL后缀,例如1LL << 33