我的一个同事问是否有未签名的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
。也就是说,的四个字节unsigned double
,的八个字节double
。
我的一个同事问是否有未签名的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
。也就是说,的四个字节unsigned double
,的八个字节double
。
unsigned double
。警告满足语言标准的诊断要求。不过,我认为这是一个编译器错误;没有充分的理由允许该代码成功编译。
Answers:
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
有趣的是,VS2010在MSDN中没有C4076警告。仅在VS2005和VS2008中存在。
在声明说明符序列中unsigned
与组合double
无效的C ++。这必须是某种MSVC扩展(或错误)。
作为一般规则,最多一个类型说明符被允许在完全DECL说明符-SEQ声明的或在一个类型说明符序列或尾随类型说明符-SEQ。该规则的唯一例外如下:
const
可以与除自身以外的任何类型说明符结合使用。volatile
可以与除自身以外的任何类型说明符结合使用。signed
或unsigned
可以结合char
,long
,short
,或int
。short
或long
可以与结合使用int
。long
可以结合使用double
。long
可以结合使用long
。
long long
在第三个要点中成为列表的一部分。
long
。然后long
可以与另一个结合long
。
在可能的情况下,未签名和已签名可充当MSVC中的类型限定符(未签名的char,signed short等)。如果无法做到这一点,例如无符号布尔或带符号双精度,则不会创建请求的类型。并且该类型仅被视为无符号[int]和带符号[int]。
unsigned double
在C和C ++中均无效。