为什么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

在声明说明符序列中将unsigneddouble相结合是无效的C ++。 这必须是某种MSVC扩展(或错误)。

通常,在声明的完整decl-specifier-seqtypes说明符seq尾随types说明符seq中最多允许一个types说明 。 这条规则的唯一例外情况如下:

  • const可以和除了自身以外的任何types说明符结合使用。
  • volatile可以和除了自身以外的任何types说明符结合使用。
  • signedunsigned可以与charlongshortint结合使用。
  • shortlong可以与int结合使用。
  • long可以double
  • long可以结合在一起。

未签名和签名作为MSVC中的types限定符,在可能的情况下(无符号字符,有符号短符号等)。 如果不可能这样做,比如unsigned bool或者signed double,那么请求的types不会被创build。 该types被视为unsigned [int]和signed [int]。

这是VS2010中的一个错误。 VS2012为该行代码提供了以下错误。

 error CS1002: ; expected 

它期待一个';' 之前的关键字“双”。