gpt4 book ai didi

c++ - 为什么来自 MSYS2 的 GNU MP (gmplib) 意外地将 ull 转换为 32 位整数?

转载 作者:行者123 更新时间:2023-12-04 15:05:37 25 4
gpt4 key购买 nike

我正在使用 MSYS2(64 位)将我的 C++ 代码从 Linux 移植到 Windows。关键库是 GNU MP (gmplib)。以下代码在 MSYS2/MinGW64 环境中给出了错误的结果,而在 Ubuntu 中工作正常。显然,当使用 mpz_set_ui 时,从 64 位整数到 32 位非整数会发生不必要的转换。功能。

#include <iostream>
#include <gmp.h>
int main() {
std::cout << "GMP version: " << __gmp_version << std::endl;
std::cout << "GMP_LIMB_BITS: " << GMP_LIMB_BITS << std::endl;

unsigned long long a = UINT64_MAX;
std::cout << a << std::endl;

mpz_t mpz;
mpz_init(mpz);
mpz_set_ui(mpz, a);

unsigned long long b = mpz_get_ui(mpz);
std::cout << b << std::endl;
}
Ubuntu 正确输出:
GMP version: 6.2.0
GMP_LIMB_BITS: 64
18446744073709551615
18446744073709551615
MSYS2/MinGW64 意外转换:
GMP version: 6.2.1
GMP_LIMB_BITS: 64
18446744073709551615
4294967295
重现行为的步骤:
  • 全新安装 MSYS2(64 位)。
  • 来自 Getting Started 的步骤来自 https://www.msys2.org/在 MSYS2 环境中运行:

  • pacman -Syu

    pacman -Su

    pacman -S --needed base-devel mingw-w64-x86_64-toolchain


  • 使用静态链接在 MinGW64 环境中编译:

  • g++ -MT .o/main.o -MD -MP -MF .d/main.Td -std=c++17 -g -Wall -Wextra -pedantic -c -o .o/main.o main.cpp

    mv -f .d/main.Td .d/main.d

    g++ -static -o main .o/main.o -lgmp

    main.d 按预期指向 C:/msys64/mingw64/include/gmp.h,我验证了 C:\msys64\mingw64\lib\libgmp.a 用于链接并且没有其他版本的 gmplib.a 存在于 C:/msys64 的子文件夹
    我还使用以下方法定制了 GNU MP 库:

    ./configure

    make

    make install


    然而,不需要的转换仍然相同。我可能会错过一些基本的东西,但我不知所措。这是我关于 Stackoverflow 的第一个问题,非常感谢您的帮助。

    最佳答案

    mpz_get_ui() 函数返回 unsigned long ,而不是 unsigned long long
    在 Linux/GCC 上, unsigned long 是一个 64 位值,但是 C++ 标准只要求 unsigned long 支持最大 4'294'967'295 的值,这可以通过 32 位整数来满足。 Linux 允许更大的值,但 Windows 上的 MSVC 和 MinGW 将为 unsigned long 使用 32 位整数。这意味着在 Windows 上,mps_set_ui() 中的 64 位输入值将降级为 32 位值。
    因此,两个编译器上的行为都是正确的,您已经被平台特定的实现细节绊倒了。
    如果您希望允许在任何地方使用 64 位整数,您应该使用固定位宽整数类型(例如 uint64_t 而不是 unsigned long ),但不幸的是,这仍然不允许您在 Windows 上指定 64 位整数 mp_set_ui

    关于c++ - 为什么来自 MSYS2 的 GNU MP (gmplib) 意外地将 ull 转换为 32 位整数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66201270/

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