gpt4 book ai didi

c++ - 为什么我在 Visual Studio 编译器中使用 strtoul 函数从十六进制到十进制的转换错误?

转载 作者:行者123 更新时间:2023-11-28 02:46:12 26 4
gpt4 key购买 nike

我正在将一个字符串从十六进制转换为十进制。问题是在 Visual Studio 编译器中,转换返回了错误的值。但是,当我使用 g++ 编译器在终端的 Mac 中编译相同的代码时,该值会正确返回。

为什么会这样?

#include <string>
#include <iostream>
using namespace std;

int main()
{
string hex = "412ce69800";

unsigned long n = strtoul( hex.c_str(), nullptr, 16 );

cout<<"The value to convert is: "<<hex<<" hex\n\n";
cout<<"The converted value is: "<<n<<" dec\n\n";
cout<<"The converted value should be: "<<"279926183936 dec\n\n";

return 0;
}

输出:

output file

最佳答案

因为在 Windows 中 long 是 32 位类型,不像大多数使用 LP64 memory model 的 Unix/Linux 实现其中 long 为 64 位。数字 412ce69800 有 39 位,本质上它不能存储在 32 位类型中。 阅读编译器警告,您会立即知道问题所在

C 标准只要求 long 至少有 32 位。 C99 添加了一个至少有 64 位的新 long long 类型,并且在所有平台上都得到保证。因此,如果您的值在 64 位类型的范围内,请使用 unsigned long longuint64_t/uint_least64_tstrtoull而不是获取正确的值。

关于c++ - 为什么我在 Visual Studio 编译器中使用 strtoul 函数从十六进制到十进制的转换错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24320912/

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