gpt4 book ai didi

c - printf 64 位类型说明符问题

转载 作者:行者123 更新时间:2023-12-04 10:37:33 24 4
gpt4 key购买 nike

我在 msdev 2010 中看到 __int64 类型有一些奇怪的行为。谁能告诉我发生了什么事?我想这里有两个问题,首先是如何显示 64 位整数,其次是行为 - 即为什么它看起来像 __int64 实际上是一个 32 位整数......

#include <stdio.h>

int main()
{
int vl_idx;
unsigned __int64 vl_64;
unsigned __int64 vl_64_test;

for (vl_idx = 0; vl_idx < 64; vl_idx++)
{
vl_64 = 1 << vl_idx;
printf ("vl_64 (%d) = %I64u\n", vl_idx, vl_64);
printf ("vl_64 (%d) = %llu\n", vl_idx, vl_64);
printf ("vl_64 (%d) = %lu\n", vl_idx, vl_64);
}
vl_64_test = 1 << 31;
if (vl_64 > vl_64_test)
printf ("greater\n");
if (vl_64 == vl_64_test)
printf ("equal\n");
if (vl_64 < vl_64_test)
printf ("less\n");

return 0;
}

前 30 次迭代的输出符合预期:

vl_64 (0) = 1
vl_64 (0) = 1
vl_64 (0) = 1
vl_64 (1) = 2
vl_64 (1) = 2
vl_64 (1) = 2
...
vl_64 (30) = 1073741824
vl_64 (30) = 1073741824
vl_64 (30) = 1073741824
vl_64 (31) = 18446744071562067968
vl_64 (31) = 18446744071562067968
vl_64 (31) = 2147483648
vl_64 (32) = 1
vl_64 (32) = 1
vl_64 (32) = 1
vl_64 (33) = 2
vl_64 (33) = 2
vl_64 (33) = 2
...
vl_64 (62) = 1073741824
vl_64 (62) = 1073741824
vl_64 (62) = 1073741824
vl_64 (63) = 18446744071562067968
vl_64 (63) = 18446744071562067968
vl_64 (63) = 2147483648
equal

但是事情会溢出来吗?在第 32 次迭代。这可能只是一个显示问题,但最后的比较表明并非如此。这是用 msdev 2010 cl(64 位版本)编译的,并在 64 位 Windows 操作系统(具有 64 位 CPU)上运行。关于为什么比较说明 1<<31 == 1<<63 有什么建议吗?

感谢您的任何建议,

吉姆

最佳答案

在处理任何比 int 宽的东西时,你需要小心整型文字,例如你需要改变:

vl_64 = 1 << vl_idx;

到:

vl_64 = 1LLU << vl_idx;

否则,在隐式转换为无符号的 64 位结果之前,首先将右侧评估为 int 表达式。

关于c - printf 64 位类型说明符问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16415691/

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