为什么 sizeof (无符号 double)等于4?

我的一个同事问我是否存在无符号 double,我说没有,但我还是检查了一下,这是在 MicrosoftVisualC + + 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字节。

4035 次浏览

在声明说明符序列中将 unsigneddouble组合是无效的 C + + 。这肯定是某种 MSVC 扩展(或 bug)。

作为一般规则,在声明的完整 Decl-说明符-序列中或在 类型说明符 -seq尾随类型说明符中最多允许一个 类型说明符。这一规则的唯一例外如下:

  • const可以与除它本身之外的任何类型说明符组合。
  • volatile可以与除它本身之外的任何类型说明符组合。
  • signedunsigned可以与 charlongshortint结合。
  • shortlong可以与 int结合。
  • long可以与 double结合。
  • long可以与 long结合。

在 MSVC 中,如果可能的话,无符号和有符号充当类型限定符(无符号字符,有符号短语等)。如果不可能做到这一点,比如无符号 bool 或有符号 double,则不会创建请求的类型。类型仅被视为 unsigned[ int ]和 signed[ int ]。

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

有趣的是,MSDN 中没有针对 VS2010的 C4076警告,它只针对 VS2005和 VS2008。

如果您将警告级别设置得更高(/W3在我的测试中) ,您将得到一个适当的警告:

警告 C4076: ‘ unsigned’: 不能与‘ double’类型一起使用

然后,如果使用调试器检查变量,一切就清楚了:

enter image description here

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

这是 VS2010中的一个错误。

error CS1002: ; expected

它期望在关键字“ double”之前有一个“ ;”。