私の同僚は unsigned double があるかどうか尋ねました.
unsigned double a;
double b;
printf("size_a=%d size_b=%d", (int) sizeof(a), (int) sizeof(b));
を出力しますsize_a=4 size_b=8。つまり、 の場合は 4 バイト、 のunsigned double場合は 8 バイトですdouble。
私の同僚は unsigned double があるかどうか尋ねました.
unsigned double a;
double b;
printf("size_a=%d size_b=%d", (int) sizeof(a), (int) sizeof(b));
を出力しますsize_a=4 size_b=8。つまり、 の場合は 4 バイト、 のunsigned double場合は 8 バイトですdouble。
unsigned double無効です。これは MSVC にも当てはまります。警告を有効にして MSCV 2010 で上記のコードをコンパイルすると、次のようになります。
warning C4076: 'unsigned' : can not be used with type 'double'
コンパイラは実際にはafterを無視 し、実際には.doubleunsignedaunsigned int
次のことを試してみると:
unsigned double a = 1.0;
実際には 2 つの警告が表示されます。
warning C4076: 'unsigned' : can not be used with type 'double'
warning C4244: 'initializing' : conversion from 'double' to 'unsigned int', possible loss of data
興味深いことに、VS2010 の MSDN には C4076 警告はありません。VS2005 および VS2008 にのみ存在します。
警告レベルを高く設定すると (私のテストでは /W3)、適切な警告が表示されます。
警告 C4076: 'unsigned': 型 'double' では使用できません
次に、デバッガーを使用して変数を検査すると、すべてが明確になります。

変数が実際にはunsigned int
unsigned宣言指定子シーケンスでのとの組み合わせdoubleは有効な C++ ではありません。これは、何らかの MSVC 拡張機能 (またはバグ) である必要があります。
原則として、宣言の完全なdecl-specifier-seqまたはtype-specifier-seqまたはTrailing-type-specifier-seqでは、最大で 1 つの型指定子が許可されます。この規則の唯一の例外は次のとおりです。
constそれ自体を除く任意の型指定子と組み合わせることができます。volatileそれ自体を除く任意の型指定子と組み合わせることができます。signedまたは、、、またはunsignedと組み合わせることができます。charlongshortintshortまたはlongと組み合わせることができますint。longと組み合わせることができますdouble。longと組み合わせることができますlong。
unsigned および signed は、可能な場合、MSVC の型修飾子として機能します (unsigned char、signed short など)。unsigned bool や signed double など、それが不可能な場合、要求された型は作成されません。また、型は単に unsigned [int] と signed [int] として扱われます。
VS2010 のバグです。VS2012 では、そのコード行に対して次のエラーが発生します。
error CS1002: ; expected
「;」が必要です キーワード「double」の前。