【问题标题】:Using uint64_t in 32 bit application在 32 位应用程序中使用 uint64_t
【发布时间】:2019-08-29 11:00:36
【问题描述】:

由于某些库,我必须以 32 位编译我的应用程序,但我需要使用超过 32 位类型最大数量的整数变量。因此,例如,如果我尝试使用 uint64_t,我会在 2147483647 处出现溢出。

我认为可以在 32 位应用程序中使用 64 位整数变量,那么我在这里错过了什么?我是否必须包含一些特定的标题命令,因此我是否必须设置一些选项?使用 VS17。

编辑:

我做了一些测试,在这个示例程序中,我可以重现我的溢出问题。

#include <iostream>

int main()
{
    uint64_t i = 0;

    while (true)
    {
        std::printf("%d\n",i);
        i += (uint64_t)10000;
    }
    return 0;
}

【问题讨论】:

  • 是什么让您认为您在 2147483647 与 uint64_t 会溢出?这是不对的。我猜您缺少的是代码中的其他一些错误,但是如果没有看到该代码,就很难提供帮助。发布让您认为在使用uint64_t 时出现int32_t 溢出的代码。在 32 位程序中使用 64 位整数变量应该很简单。
  • 我可以假设您在 uint64_t v = 2147483648; 中使用了类似的文字吗?默认情况下,文字是 int,因此您必须使用 uint64_t v = 2147483648u;uint64_t v = 68719476735ull;
  • 到您的编辑:std::printf("%d\n",(uint64_t)i); 应该产生格式的大小(32 位)与实际参数不匹配的警告
  • i 的值正常,打印错误
  • 所以用 en.cppreference.com/w/cpp/language/implicit_conversion 武装自己并检查所有的计算 :)

标签: c++ 32bit-64bit


【解决方案1】:

错误就在这里:

std::printf("%d\n",i);
             ^^

您使用了错误的格式说明符,因此程序的行为未定义。 %d 用于 signed int。你需要使用

std::printf("%" PRIu64 "\n",i);

PRIu64&lt;cinttypes&gt; 中声明。

附:您还没有包含声明 std::printf 的标头。

【讨论】:

  • 所以如果我期望 long 值超过 32 位,那么 size_t 是坏的,而 uint64_t 是好的。对吗?(我的意思是在 32 位构建中)当我们在 32 位和 64 位中使用 size_t 时?
  • And when we use size_t, in both 32bit and 64bit? 我们通常使用size_t 来表示对象的大小或数组的索引。
猜你喜欢
  • 2012-12-27
  • 1970-01-01
  • 1970-01-01
  • 2018-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多