gpt4 book ai didi

c++ - strtoul 不是字节序安全的吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:57:21 26 4
gpt4 key购买 nike

所以我在小端和大端机器上都使用 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。那就是你要打的。我假设一个在 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;
}

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

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

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