4

所以我在小端和大端机器上使用 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

PS 对于 Big endian 示例,似乎总是返回相同的数字。

4

1 回答 1

4

strtoul溢出时返回ULONG_MAX。这就是你要打的。我假设一个在 Endianess 差异之上运行在 32 位上,另一个在 64 位上运行。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;
}

请注意,这unsigned long long必须unsigned __int64与 MSVC 一起使用。其他编译器可能还有其他名称。如果幸运的话,您将在所有平台上都有标准类型,并且可以使用uint64_t...

于 2011-04-22T03:26:48.237 回答