所以我在一个小端和大端机器上使用strtoul从字符串转换为unsigned long。小端机器返回正确的值,而大端机器则没有。这个功能在大端机器上真的不兼容吗?如果是这样,有解决方法吗?
代码:
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
P.S。对于Big endian示例,似乎总是返回相同的数字。
答案 0 :(得分:4)
strtoul
在溢出时返回ULONG_MAX
。这就是你要打的。我假设一个在32位上运行,另一个在64位上运行Endianess差异。 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。其他编译器可能还有其他名称。如果您很幸运,您将在所有平台上拥有standard types,并且可以使用uint64_t
...