Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么在VisualStudio编译器中使用strtoul函数从十六进制到十进制的转换错误?_C++_Visual Studio 2012_Long Integer_Strtol_Strtoull - Fatal编程技术网

C++ 为什么在VisualStudio编译器中使用strtoul函数从十六进制到十进制的转换错误?

C++ 为什么在VisualStudio编译器中使用strtoul函数从十六进制到十进制的转换错误?,c++,visual-studio-2012,long-integer,strtol,strtoull,C++,Visual Studio 2012,Long Integer,Strtol,Strtoull,我正在将字符串从十六进制转换为十进制。问题是在VisualStudio编译器中,转换返回了错误的值。但是,当我在终端使用g++编译器在Mac中编译相同的代码时,返回的值是正确的 为什么会这样 #include <string> #include <iostream> using namespace std; int main() { string hex = "412ce69800"; unsigned long n = strtoul( hex.c_

我正在将字符串从十六进制转换为十进制。问题是在VisualStudio编译器中,转换返回了错误的值。但是,当我在终端使用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;
}
#包括
#包括
使用名称空间std;
int main()
{
字符串hex=“412ce69800”;
无符号长n=strtoul(hex.c_str(),nullptr,16);

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


C标准只要求
long
至少有32位。C99添加了一个新的
long-long
类型,该类型至少有64位,这在所有平台上都是有保证的。因此,如果您的值在64位类型的范围内,请使用
无符号long-long
uint64\t/uint64\t
来获得正确的值。

注意t VS是一个IDE,不是编译器。它在内部使用MS的
cl.exe
编译器,您也可以从命令行运行
cl
,就像gccI认为它依赖于编译器,而不是依赖于操作系统一样。此外,我不确定您的解决方案是否有效,因为
strtoul
在任何情况下都返回
无符号的long
。@barakmanos几分钟前编辑为使用strtoull,我知道的所有编译器都符合操作系统的类型我有机会在运行“独立”的嵌入式软件上工作(即没有操作系统、没有调度、没有虚拟内存、进程、线程等)。因此,我看不出类型的大小是如何由编译器以外的任何东西决定的。如果有的话,编译器将符合CPU体系结构。@barakmanos当然类型是由编译器定义的。也许有些奇怪的编译器在x86上有18位int或16位char,但仍然完全符合C标准,但我我从未见过这样的操作系统。我所知道的所有操作系统的类型大小都与它们的目标操作系统相同(如果有的话),如果没有操作系统,那么他们可以拥有他们想要的大小。我承认我还没有完全调查过这一点,但凭直觉,我猜操作系统本身(被指定在特定处理器上运行)是使用适当的工具链构建的(即,适合手头特定处理器的编译器和链接器)所以正确的方法是类型大小由编译器决定。同样,这正是我的直觉告诉我的。