我的一个同事问是否有未签名的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 ++中均无效。