72

我的一位同事问是否有 unsigned double,我说没有,但我还是检查了它,这在Microsoft Visual C++ 2010中编译:

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'

编译器实际上忽略了 doubleafter unsigned,使你a实际上是一个unsigned int.

如果您尝试以下操作:

unsigned double a = 1.0;

您实际上会收到两个警告:

warning C4076: 'unsigned' : can not be used with type 'double'
warning C4244: 'initializing' : conversion from 'double' to 'unsigned int', possible loss of data

有趣的是,在 MSDN 中没有针对 VS2010 的 C4076 警告。它仅适用于 VS2005 和 VS2008。

于 2013-02-20T10:34:34.010 回答
26

如果您将警告级别设置得更高(我的测试中为 /W3),您将收到适当的警告:

警告 C4076:“无符号”:不能与“双”类型一起使用

如果您随后使用调试器检查变量,一切都会变得清晰:

在此处输入图像描述

您可以看到该变量实际上是unsigned int

于 2013-02-20T10:46:13.253 回答
24

在声明说明符序列中结合unsignedwithdouble不是有效的 C++。这必须是某种 MSVC 扩展(或错误)。

作为一般规则,在声明的完整decl-specifier-seq或type-specifier-seqtrailing-type-specifier-seq中最多允许一个类型说明符。此规则的唯一例外情况如下:

  • const可以与除自身之外的任何类型说明符组合。
  • volatile可以与除自身之外的任何类型说明符组合。
  • signedorunsigned可以与char, long, short, 或结合使用int
  • short或者long可以与int.
  • long可以与double.
  • long可以与long.
于 2013-02-20T10:25:01.263 回答
4

在可能的情况下,无符号和有符号在 MSVC 中充当类型限定符(无符号字符、有符号短等)。如果无法做到这一点,例如 unsigned bool 或 signed double,则不会创建请求的类型。并且类型只是被视为无符号 [int] 和有符号 [int]。

于 2013-02-20T10:32:49.187 回答
2

这是VS2010中的一个错误。VS2012 对该行代码给出以下错误。

error CS1002: ; expected

它期待一个';' 在关键字“双”之前。

于 2013-02-20T17:51:24.523 回答