簡體   English   中英

strtoul不是endian安全嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM