为什么sizeof(无符号双精度)等于4?

时间:2013-02-20 10:23:30

标签: c++ visual-studio-2010

我的一位同事询问是否有未签名的双,我说没有,但我仍然检查了,这在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个字节。

5 个答案:

答案 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'类型一起使用

如果您随后使用调试器检查变量,则一切都变得清晰:

enter image description here

您可以看到该变量实际上是unsigned int

答案 2 :(得分:24)

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

  

作为一般规则,在声明的完整 decl-specifier-seq 类型说明符中最多允许一个类型说明符 -seq trailing-type-specifier-seq 。此规则的唯一例外如下:

     
      
  • const可以与除自身之外的任何类型说明符组合使用。
  •   
  • volatile可以与除自身之外的任何类型说明符组合使用。
  •   
  • signedunsigned可与charlongshortint结合使用。
  •   
  • shortlong可与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'之前。