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