[晴 2006/11/13 01:33 | by turbozv ]
根据ISO/IEC 14882:2003(E)对C++的标准定义来看,第15页到19页,一个integer后缀可以为:
uU, fF, lL

不过,微软扩展了一些后缀:
http://msdn2.microsoft.com/en-us/library/00a1awxf.aspx
iN (N=8, 16, 32, 64), LL, ll

比如:-1i16, 256i32等等……


让人疑惑的是这个iN。

对于iN的修饰的整型长度为N位,比如sizeof(0i8), sizeof(0i16), sizeof(0i32), sizeof(0i64) 的值分别为1, 2, 4, 8。

你可以将i8理解为(char), 所以 0i8 == (char)(0)。 (当然ui8就是unsigned char, 0ui8 == (unsigned char)0)

请看下面程序:
int a;
1)a = 256i8;
2)a = char(256);
3)char c = 256; a = c;


全部都是等价的操作。


那么,为什么微软要加这样一个定义呢?

来看看常用的地方:
#define _I32_MIN (-2147483647i32-1) /* minimum signed 32 bit value */
#define _I32_MAX 2147483647i32 /* maximum signed 32 bit value */
#define _UI32_MAX 0xffffffffui32 /* maximum unsigned 32 bit value */

我个人感觉就是避免了一个显式转换而已,其实也可以定义为:
#define _I32_MIN (int32_t)(-2147483647-1) /* minimum signed 32 bit value */
#define _I32_MAX (int32_t)2147483647 /* maximum signed 32 bit value */
#define _UI32_MAX (uint32_t)0xffffffff /* maximum unsigned 32 bit value */


HOHO~

再来看个例子:
int a = -32768i16;
问A等于多少?

要搞清楚这个问题就要知道运算符的优先顺序,"-"是修饰32768还是修饰32768i16的。试验的结果是后者。
所以 -32768i16 被编译器理解为 -(32768i16)。所以 a = -((short)(32768));

不过编译器不支持 (-32768)i16,因为()是表达式了,而i只能修饰定义的常量…… sweat

还有一个很让人疑惑的地方就是:
char a = 1i32;
int a = 1; b = a;


把编译开关设置为 /W4,结果是第一行没有产生警告信息,第二行有丢失数据的警告信息。 我想到的原因就是,常量赋值的时候,编译器很容易做结果检查,所以就自动帮程序员转换成正确的类型了。(你可以试试 char a = 128i32; 就会产生警告信息)。

结论:Compiler is smart enough!
程序 | 评论(0) | 引用(0) | 阅读(7013)