为什么sizeof(无符号双)等于4?
我的一个同事问是否有无符号的双倍,我说没有,但我仍然检查它,这在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
双字节是四个字节,双字节是八个字节。
unsigned double
精度无效。 这在MSVC中也是如此。 在启用警告的情况下编译MSCV 2010中的上述代码时,您将得到:
warning C4076: 'unsigned' : can not be used with type 'double'
编译器在unsigned
后实际上忽略了 double
,使得你的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中没有C4076警告。 它仅适用于VS2005和VS2008。
如果您将警告级别设置得更高(在我的testing中为/ W3),您将得到相应的警告:
警告C4076:'unsigned':不能与'double'types一起使用
如果您然后使用debugging器来检查variables,一切都变得清晰:
你可以看到这个variables实际上是一个unsigned int
在声明说明符序列中将unsigned
和double
相结合是无效的C ++。 这必须是某种MSVC扩展(或错误)。
通常,在声明的完整decl-specifier-seq或types说明符seq或尾随types说明符seq中最多允许一个types说明 符 。 这条规则的唯一例外情况如下:
const
可以和除了自身以外的任何types说明符结合使用。volatile
可以和除了自身以外的任何types说明符结合使用。signed
或unsigned
可以与char
,long
,short
或int
结合使用。short
或long
可以与int
结合使用。long
可以double
。long
可以结合在一起。
未签名和签名作为MSVC中的types限定符,在可能的情况下(无符号字符,有符号短符号等)。 如果不可能这样做,比如unsigned bool或者signed double,那么请求的types不会被创build。 该types被视为unsigned [int]和signed [int]。
这是VS2010中的一个错误。 VS2012为该行代码提供了以下错误。
error CS1002: ; expected
它期待一个';' 之前的关键字“双”。