5

LLUuint64 リテラルのサフィックスとして使用するライブラリがあります。

Visual Studio 2010 (windows7-64 上) は、「番号の不適切なサフィックス」について不平を言い、使用するライブラリにパッチを当てますLL。有効にするために設定する必要があるプリプロセッサの定義またはプロパティのチェック ボックスはありますLLUか?

ps誰もが正しい動作を知っていますか? 私は常に、VC++ が行うことはすべて標準の反対であると想定していましたが、最近は状況が改善されました。

4

1 に答える 1

5

私が利用できる標準 (ドラフトのみですが、かなり最近のバージョン) を見ると、C++ と C の両方で、整数リテラルの有効な接尾辞として "ULL" と "LLU" の両方が定義されています。これは、VS2010 が従わない最近の変更である可能性がありますが、VS2012 がまったく同じことを行うことに注意してください (つまり、ULL のみが機能します)。

符号付きリテラルと符号なしリテラルの使用には違いがあり、それが符号付き値を右シフトしたときの MSVC の動作です。符号付きリテラルは符号拡張されますが、符号なしリテラルはゼロで埋められます。

つまり、次の不自然な例です。

unsigned long long l2 = ~0LL >> 5;
unsigned long long l3 = ~0ULL >> 5;

...MSVC では 2 つの異なる値が生成されます。

したがって、ライブラリが符号なしの値を規定することによって定義済みの動作を期待している場合、それらを符号なしの値に変換すると、未定義の動作が発生する可能性があります。

要するに、MSVC はサフィックスの 1 つの形式しか受け入れないという点で少しいたずらだと思いますが、最善の解決策は、'U' が表示される場所を切り替えて、完全に削除しないことです。

于 2013-01-30T10:11:48.073 に答える