开门见山,先来看一段简单的代码:
1 #include
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---