我的一位同事问是否有 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
。
我的一位同事问是否有 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
。
unsigned double
是无效的。在 MSVC 中也是如此。在启用警告的 MSCV 2010 中编译上述代码时,您会得到:
warning C4076: 'unsigned' : can not be used with type 'double'
编译器实际上忽略了 double
after 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。
如果您将警告级别设置得更高(我的测试中为 /W3),您将收到适当的警告:
警告 C4076:“无符号”:不能与“双”类型一起使用
如果您随后使用调试器检查变量,一切都会变得清晰:
您可以看到该变量实际上是unsigned int
在声明说明符序列中结合unsigned
withdouble
不是有效的 C++。这必须是某种 MSVC 扩展(或错误)。
作为一般规则,在声明的完整decl-specifier-seq或type-specifier-seq或trailing-type-specifier-seq中最多允许一个类型说明符。此规则的唯一例外情况如下:
const
可以与除自身之外的任何类型说明符组合。volatile
可以与除自身之外的任何类型说明符组合。signed
orunsigned
可以与char
,long
,short
, 或结合使用int
。short
或者long
可以与int
.long
可以与double
.long
可以与long
.
在可能的情况下,无符号和有符号在 MSVC 中充当类型限定符(无符号字符、有符号短等)。如果无法做到这一点,例如 unsigned bool 或 signed double,则不会创建请求的类型。并且类型只是被视为无符号 [int] 和有符号 [int]。
这是VS2010中的一个错误。VS2012 对该行代码给出以下错误。
error CS1002: ; expected
它期待一个';' 在关键字“双”之前。