[英]is strtoul not endian safe?
所以我在一個小端和大端機器上使用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
PS似乎總是為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;
}
注意, unsigned long long
必須是帶有MSVC的unsigned __int64
。 其他編譯器可能還有其他名稱。 如果您很幸運,您將在所有平台上擁有標准類型 ,並且可以使用uint64_t
...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.