C语言拾遗(一):整型提升
开门见山,先来看一段简单的代码:
1 #include <stdio.h> 2 3 int array[] = {1, 2, 3, 4, 5, 6, 7}; 4 #define TOTAL_ELEMENTS (sizeof(array) / sizeof(array[0])) 5 6 int main() 7 { 8 int i = -1; 9 int x; 10 11 if(i <= TOTAL_ELEMENTS - 2) { 12 x = array[i + 1]; 13 printf("x = %d.\n", x); 14 } 15 16 printf("now i = %d.\n", TOTAL_ELEMENTS); 17 18 return 0; 19 }
执行结果:
randy@ubuntu:~/C_Language$ ./a.out
now i = 7.
是不是很奇怪?为什么没有打出line13的x = ?。
是这样的。这个小例子有三点值得注意:
1.sizeof()是运算符,返回类型是无符号的,即非负数。
2.if语句在singned int和unsigned int之间进行判断语句,根据C语言的整型提升规则,如果原始类型的所有值都可用int类型表示,则其值将被转换为int类型;否则将被转换为unsigned int类型。因此此时的i将会被升级成无符号类型。
3.i = -1被升级为无符号型,值究竟是多少?这要用到整型转换规则:K&R上这样解释,将任何整数转换为某种指定的无符号数类型数的方法是:以该无符号数类型能够表示的最大值加1为摸,找出与此整数同余的最小的非负值。听着很拗口,其实说白了,只要知道原整数的二进制表达方法,再用要即将转换的类型去解析,就得到升级后的值了。 比如-1,负数在计算机里用补码表示,0xffffffff,那升级成无符号型之后,值就是0xffffffff,显然比TOTAL_ELEMENTS(7)大。
---End---