根据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)
请看下面程序:
1)a = 256i8;
2)a = char(256);
3)char c = 256; a = c;
全部都是等价的操作。
那么,为什么微软要加这样一个定义呢?
来看看常用的地方:
#define _I32_MAX 2147483647i32 /* maximum signed 32 bit value */
#define _UI32_MAX 0xffffffffui32 /* maximum unsigned 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~
再来看个例子:
问A等于多少?
要搞清楚这个问题就要知道运算符的优先顺序,”-“是修饰32768还是修饰32768i16的。试验的结果是后者。
所以 -32768i16 被编译器理解为 -(32768i16)。所以 a = -((short)(32768));
不过编译器不支持 (-32768)i16,因为()是表达式了,而i只能修饰定义的常量……
还有一个很让人疑惑的地方就是:
int a = 1; b = a;
把编译开关设置为 /W4,结果是第一行没有产生警告信息,第二行有丢失数据的警告信息。 我想到的原因就是,常量赋值的时候,编译器很容易做结果检查,所以就自动帮程序员转换成正确的类型了。(你可以试试 char a = 128i32; 就会产生警告信息)。