不可能在 C 中打印长整数



我知道有很多关于这个主题的主题,但没有一个帮助我解决我的问题。我处理代码::块(在"属性>项目构建选项>编译器设置>其他选项"中使用选项 -std=c99(,以下代码没有给出预期的输出:

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

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

当我写 30 而不是 33(所以 val 是一个整数(时,我得到了最严格的答案。我也尝试过%lld,但这无济于事。

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

一个简单的解决方法是编写1LL << 331LLlong long,33也会晋升为该类型。C++标准保证long long至少为 64 位。

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

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

C11:6.5.7 按位移位运算符:

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

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

相关内容

  • 没有找到相关文章

最新更新