4

そのため、リトルエンディアンとビッグエンディアンの両方のマシンでstrtoulを使用して、文字列からunsignedlongへの変換を行っています。リトルエンディアンのマシンは正しい値を返しますが、ビッグエンディアンのマシンは返しません。この関数は本当にビッグエンディアンのマシンと互換性がありませんか?もしそうなら、回避策はありますか?

コード:

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ビッグエンディアンの例では、常に同じ番号が返されるようです。

4

1 に答える 1

4

strtoulULONG_MAXオーバーフロー時に戻ります。それはあなたが打っているものです。エンディアンの違いに加えて、一方が32ビットで実行され、もう一方が64ビットで実行されていると想定しています。4294967295 == 0xFFFFFFFF、32ビットマシンの場合はULONG_MAX


以下が両方のシステムで機能するかどうか試してください。これまでのところ、64ビットのリトルエンディアン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他のコンパイラもまた他の名前を持っているかもしれません。運が良ければ、すべてのプラットフォームに標準タイプuint64_tがあり、使用できます...

于 2011-04-22T03:26:48.237 に答える