我的一个同事问我是否存在无符号 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字节。
size_a=4 size_b=8
unsigned double
double
在声明说明符序列中将 unsigned与 double组合是无效的 C + + 。这肯定是某种 MSVC 扩展(或 bug)。
unsigned
作为一般规则,在声明的完整 Decl-说明符-序列中或在 类型说明符 -seq或 尾随类型说明符中最多允许一个 类型说明符。这一规则的唯一例外如下: const可以与除它本身之外的任何类型说明符组合。 volatile可以与除它本身之外的任何类型说明符组合。 signed或 unsigned可以与 char、 long、 short或 int结合。 short或 long可以与 int结合。 long可以与 double结合。 long可以与 long结合。
作为一般规则,在声明的完整 Decl-说明符-序列中或在 类型说明符 -seq或 尾随类型说明符中最多允许一个 类型说明符。这一规则的唯一例外如下:
const
volatile
signed
char
long
short
int
在 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。
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’类型一起使用
然后,如果使用调试器检查变量,一切就清楚了:
您可以看到该变量实际上是一个 unsigned int
这是 VS2010中的一个错误。
error CS1002: ; expected
它期望在关键字“ double”之前有一个“ ;”。