看下面的一段程序:
1 float sum(float a[], unsigned int len)
2 {
3 int i;
4 float r = 0.0;
5 for (i = 0; i <= len - 1; ++i)
6 {
7 r += a[i];
8 }
9 return r;
10 }
如果len为0,那么这段代码将不会返回0.0。而是段错误。
另外,当在无符号数和有符号数之间进行类型转换时,不同的转换顺序会得到不同的结果。如:
1
2 unsigned x = 0xFFFF;
3 (int) ((word << 24) >> 24);
4 ((int) word << 24) >> 24;
第一个表达式的结果是0xFF,而第二个是0xFFFFFFFF.原因是第一个表达式的右移运算高位补0,而第二个右移运算高位补1.
测试代码:
1 #include <stdlib.h>
2 #include <stdio.h>
3 float sum(float a[], unsigned int len)
4 {
5 int i;
6 float r = 0.0;
7 for(i = 0; i <= len - 1; ++i)
8 {
9 r += a[i];
10 }
11