因此,我在小端和大端机器上都使用strtoul将字符串转换为无符号长整型。小字节序机器返回正确的值,而大字节序机器不返回正确的值。此功能在大型字节序计算机上真的不兼容吗?如果是这样,是否有解决方法?

码:

printf ("%s\n",cLongs);
theLongs[i] = strtoul(cLongs, NULL, 10);
cout << "returned unsigned long value from string: " << theLongs[i] << endl;

小字节序结果:
1099188638048931
returned unsigned long value from string: 1099188638048931

大端优先结果:
1099188638048931
returned unsigned long value from string: 4294967295

附言看来对于Big endian示例总是返回相同的数字。

最佳答案

strtoul在溢出时返回ULONG_MAX。那就是你要打的。我假设一个在Endianess差异之上,另一个在32位上运行。 4294967295 == 0xFFFFFFFF,对于32位计算机,该名称为ULONG_MAX

尝试以下方法在两个系统上是否都适合您。到目前为止,我只能在64位Little Endian Linux上进行测试。如果是这样,则可以使用字符串流进行转换(无论如何,这都是C++风格):

#include <iostream>
#include <sstream>

int main()
{
  using namespace std;
  string sval("1099188638048931"); // your huge value, exceeding 32bit
  istringstream sst(sval); // assign string to a stream
  unsigned long long myval;
  sst >> myval; // convert stream to unsigned 64bit integer
  cout << myval << endl; // output the converted result
  return 0;
}

请注意,对于MSVC,unsigned long long必须是unsigned __int64。其他编译器可能再次使用其他名称。如果幸运的话,您将在所有平台上安装standard types并可以使用uint64_t ...

关于c++ - strtoul不安全吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5751972/

10-09 05:05