【问题标题】:Strange behaviour of 64 bit integer in C++C++ 中 64 位整数的奇怪行为
【发布时间】:2026-01-02 16:30:02
【问题描述】:

我对编程很陌生,我最近学了一点 C++,我正在使用 Visual Studio 2017 社区版。

我需要使用 64 位整数来存储一个值并执行一些算术运算,但是我的编译器只允许我使用我创建的“int64”变量的 32 位。

这是一些代码和行为的示例

    unsigned __int64  testInt = 0x0123456789ABCDEF;

printf("int value = %016X\n", testInt); // only 32 bits are being stored here? (4 bytes)

printf("size of integer in bytes = %i\n\n", sizeof(testInt)); // size of int is correct (8 bytes)

存储在变量中的值似乎是 0x0000000089ABCDEF。 为什么我不能使用这个整数的所有 64 位,它似乎充当 32 位 int?

可能我错过了一些基本的东西,但我在搜索中找不到与此相关的任何东西:(

【问题讨论】:

  • 您需要使用%016llX 而不是%016X%X 需要一个 32 位整数。
  • %X 格式假定为标准 unsigned(可能不是 64 位),而不是 unsigned __int64。根据记忆,VS2017 中的 unsigned 是 32 位的。您需要使用ll 前缀来获取long long unsigned
  • 中定义了 64 位特定格式说明符。见*.com/a/9225648/925478
  • 使用调试器确定变量的实际内容。
  • @Reggie 我很高兴它成功了,但是为了将来的参考,学习编写可移植代码是非常明智的,这意味着处理宏和"%016" PRIX64

标签: c++ visual-studio int64


【解决方案1】:

如果它只是一些基本的东西会很好,但事实证明 64 位整数在所有平台上都不能一致地处理,所以我们必须依靠宏。

This answer 描述了PRIu64PRIx64 以及<inttypes.h> 中包含的相关宏的使用。这看起来很有趣,但我认为便携式解决方案看起来像:

#include <inttypes.h>
unsigned __int64  testInt = 0x0123456789ABCDEF;
printf("int value = %016" PRIX64 "\n", testInt);

PRIX64 会根据您的平台扩展为适当的格式说明符(对于 Visual Studio,可能是 llX)。

【讨论】:

  • PRIX64,而不是 PRIx64 - OP 的原始代码需要大写十六进制输出。根据该答案中的链接,这两个宏是不同的。
【解决方案2】:

格式说明符 %X 采用无符号整数(在您的系统上可能是 32 位),而 __int64 对应于 long long

请改用printf("int value = %016llX\n", testInt)。例如,可以在cppreference.com 找到文档。

【讨论】:

  • 为了获得最大的可移植性(因此,要为 x86_64 编写可移植的 C++ 而不是 Visual C++),在 @MykWillis 的链接中使用 printf("int value = %016" PRIX64 "\n", testInt) 不是最好的吗?
  • @Darael:可能是的;虽然我认为unsigned __int64 也不是可移植的......