深入了解计算机系统书中的一个疑惑
《深入了解计算机系统》(修订版),第54页的那个例子:
float sum_elements(float a[], unsigned length)
{
int i;
float result = 0;
for(i = 0; i <= length -1; i++)
{
result+=a[i];
}
return result;
}
书上说此例因为无符号数到有符号数的转变,必然使得length等于0,或者是出现存储器错误,可是我编写了下面一个程序,结果在是Visual C++ 6.0和 gcc下编译通过。
#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[10] = {0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0,7.0,8.0,9.0};
unsigned len = 10;
printf( "%f\n ", sum_elements(a, len));
}
不知道是我的程序有错还是书上的错误?
[解决办法]
只要不出现(unsigned)i <0就行吧。
[解决办法]
这里只是读length的值,并没有对length的存储单元进行写操作。
也就没有无符号数到有符号数的转变。
[解决办法]
不对, 书上好象不是这个意思.
书上应该是在说, 如果, 你将 length = 0 作为实参时. 预期函数的结果应该是返回 0.0 .但是, 实际上, 你会获得一个内存抱错. 这是因为, unsigned 向 signed 转换后, 造成函数出现的不正确行为.
[解决办法]
哦. 应该是 signed 转 unsigned . 针对变量 i 转.
[解决办法]
结果在是Visual C++ 6.0和 gcc下编译通过
==========================================
你有没有把0传进去跑过?
[解决办法]
i <=length -1;
运算时,窄类型向宽类型转化, length - 1结果为unsigned类型, 尤其是length为0时 其结果成为了最大的正整数, 然后i在同上述结果作 <=运算时, i要转化为unsigned类型参与运算,所以就导致了问题