72

私の同僚は 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

4

5 に答える 5

141

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 にのみ存在します。

于 2013-02-20T10:34:34.010 に答える
26

警告レベルを高く設定すると (私のテストでは /W3)、適切な警告が表示されます。

警告 C4076: 'unsigned': 型 'double' では使用できません

次に、デバッガーを使用して変数を検査すると、すべてが明確になります。

ここに画像の説明を入力

変数が実際にはunsigned int

于 2013-02-20T10:46:13.253 に答える
24

unsigned宣言指定子シーケンスでのとの組み合わせdoubleは有効な C++ ではありません。これは、何らかの MSVC 拡張機能 (またはバグ) である必要があります。

原則として、宣言の完全なdecl-specifier-seqまたはtype-specifier-seqまたはTrailing-type-specifier-seqでは、最大で 1 つの型指定子が許可されます。この規則の唯一の例外は次のとおりです。

  • constそれ自体を除く任意の型指定子と組み合わせることができます。
  • volatileそれ自体を除く任意の型指定子と組み合わせることができます。
  • signedまたは、、、またはunsignedと組み合わせることができます。charlongshortint
  • shortまたはlongと組み合わせることができますint
  • longと組み合わせることができますdouble
  • longと組み合わせることができますlong
于 2013-02-20T10:25:01.263 に答える
4

unsigned および signed は、可能な場合、MSVC の型修飾子として機能します (unsigned char、signed short など)。unsigned bool や signed double など、それが不可能な場合、要求された型は作成されません。また、型は単に unsigned [int] と signed [int] として扱われます。

于 2013-02-20T10:32:49.187 に答える
2

VS2010 のバグです。VS2012 では、そのコード行に対して次のエラーが発生します。

error CS1002: ; expected

「;」が必要です キーワード「double」の前。

于 2013-02-20T17:51:24.523 に答える