2

MFC プロジェクトで 16 進文字列から整数への変換を試みています。コードは次のようになります。

CString sMask = "0xFFFFFFE0";
char* pMaskBuffer   = sMask.GetBuffer(sMask.GetLength());               
sMask.ReleaseBuffer();
char * p = NULL;
long iMask = strtol(pMaskBuffer, &p, 16);

sMask 変数が小さい場合、コードは正常に機能していましたが、4 バイトのマスクが奇妙な値を生成しています。4294967264 の代わりに、2147483647 を取得しています。これを克服する方法。助けてください。

4

3 に答える 3

5

これは、strtol がこれを長く使用して返すためです。

unsigned long iMask = strtoul(pMaskBuffer, &p, 16);
于 2013-10-31T07:52:43.093 に答える
3

また、使用後は必ず ReleaseBuffer を行ってください。あなたのプログラムには未定義の動作があります

GetBuffer によって返されるアドレスは、ReleaseBuffer またはその他の CString 操作の呼び出し後に無効になります。

http://msdn.microsoft.com/en-us/library/aa300574(v=vs.60).aspx

人々が説明したように、unsigned long解析が必要です。

于 2013-10-31T07:53:08.090 に答える
1

std::strtol参照ページから:

変換後の値が対応する戻り値の型の範囲外の場合は、範囲エラー(errnoに設定ERANGE)となり、 LONG_MAXLONG_MIN、 ... が返されます。

あなたの場合LONG_MAXは が返されます。確認すれば、errnoきっとERANGE. その理由strtolは、符号付きの値のためです。符号なしの値が必要な場合は、 を使用する必要がありますstd::strtoul


また、将来 C++11 関数を使用するように変更すると、この場合は例外std::stolがスローされることに注意してください。std::out_of_range

于 2013-10-31T07:50:52.717 に答える