首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

深入了解计算机系统书中的一个疑惑,该如何解决

2012-03-23 
深入了解计算机系统书中的一个疑惑《深入了解计算机系统》(修订版),第54页的那个例子:floatsum_elements(flo

深入了解计算机系统书中的一个疑惑
《深入了解计算机系统》(修订版),第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类型参与运算,所以就导致了问题

热点排行