私の同僚は 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を無視 し、実際には.double
unsigned
a
unsigned 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
と組み合わせることができます。char
long
short
int
short
または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」の前。