- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 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
重现行为的步骤:
Getting Started
的步骤来自 https://www.msys2.org/在 MSYS2 环境中运行:pacman -Syu
pacman -Su
pacman -S --needed base-devel mingw-w64-x86_64-toolchain
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
C:/msys64
的子文件夹
./configure
make
make install
最佳答案
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/
所以用下面的代码,把参数x的类型从const ull改为const ull&(用typedef unsigned long long ull) 在使用 gcc 4.7.2 和标志 -O3 -std=c
这个问题在这里已经有了答案: ULL suffix on a numeric literal (3 个答案) 关闭 3 年前。 在为测试内存而编写的模式末尾添加 ULL 有什么用? 例如 uint6
我写了一段代码: int main() { long long a = 1a1b2a2b3a3b4a4b; long *p1; long *p2; long *p3;
我看到了问题mpz_t to unsigned long long conversion (gmp lib)的帖子Chris Jester-Young 给了我答案 mpz_t ull2mpz(unsi
我遇到过这样的代码: line += addr & 0x3fULL; 显然,“U”和“L”不是十六进制数字。我猜那个十六进制数字文字末尾的'ULL'表示“无符号长长” - 我正确吗? (这种东西很难用
在 C++ 中对负常量使用无符号后缀是好习惯吗? 例如,使用安全吗, foo(-1ull); 代替 foo(unsigned long long(-1)); 最佳答案 它并没有真正用于“负常数”。 C
我有以下代码: #include #include #define APPEND(x, y) x ## y #define ULL(x) APPEND(x, ull) int main (void
我有一个巨大的 2048 位字符串(例如,长度为 256 的“加密”字符串)它可以采用随机值,这意味着不需要 ASCII 值。我的目标是将其分块为无符号长整型 (ULL) 值以用于某些自定义操作(仅在
我正在使用 MSYS2(64 位)将我的 C++ 代码从 Linux 移植到 Windows。关键库是 GNU MP (gmplib)。以下代码在 MSYS2/MinGW64 环境中给出了错误的结果,
我是一名优秀的程序员,十分优秀!