深入理解计算机系统 练习题 2.25
程序员文章站
2022-07-04 19:30:41
...
代码:
#include <stdio.h>
float sum_elements(float a[],unsigned length){
int i;
float result = 0;
for (i = 0; i <= length-1; i++)
result += a[i];
return result;
}
int main() {
float a[3] = {1.2,2.2,3.4};
printf("%f",sum_elements(a,0));
}
运行结果:
若length为0,输出结果理应为result的初值,即0,但运行的结果却是没有输出任何东西。
于是乎我便使出了看家绝活print大法
:
int main() {
int i = 0;
unsigned j = 0;
printf("%x %x\n", i-1, j-1);
printf("%d %u\n", i-1, j-1);
}
得到的二进制表示结果为ffffffff
,以带符号整型与无符号整型表示为-1
与4294967295
.
我们终于知道了原因所在——在执行length-1
时,无符号整型length
转换为带符号整型,然后再与1
相减,得到的结果为4294967295
,因此i
会一直小于length-1
,直至数组越界。
我的编译器为何不报错 /(ㄒoㄒ)/~
解决方案:
将length
由unsigned
变成int
#include <stdio.h>
float sum_elements(float a[],int length){
int i;
float result = 0;
for (i = 0; i <= length-1; i++)
result += a[i];
return result;
}
int main() {
float a[3] = {1.2,2.2,3.4};
printf("%f",sum_elements(a,0));
}
运行结果:
done!
总结:在进行运算操作时,无符号整型会隐式地转换为带符号整型,所以在编写代码时,需要注意数据的隐式转换,并且如果并非有特殊需求,尽量不要使用无符号整型,以减少出错的可能性。