关于有符号数与无符号数的建议

来源:互联网 发布:全包半包和清包 知乎 编辑:程序博客网 时间:2024/05/18 03:29

有符号数到无符号数的隐式强制类型转换导致了某些非直观的行为。这些非直观的行为经常导致程序错误,并且这种包含隐式强制类型转换细微的错误很难被发现。
下面两个例题说明了某些由于无符号数隐式强制类型转换造成的细微错误。
Ex1:

float sum_elements(float a[],unsigned length){    int i;    float result=0;    for(i=0;i<=length-1;i++)        result+=a[i];    return result;}

当参数等于0时,运行这段代码应该返回0.0。但实际上,运行时会遇到一个存储器错误。
这是因为length是无符号类型,当它与有符号类型在一起运算时,有符号会隐式转换为无符号类型,而length=0传入后,得到-1的无符号类型,所以i<=unsigned(-1)。而无符号-1是一个很大的整数,这样就会超出数组的范围产生存储器错误。有两种方法可以修改上面的错误:1)把length令为int类型;或2)for语句中的判断语句改成i小于length。
其他更深入的例子的可以看《深入理解计算机系统》第二版 P53。为了避免这类错误的一种方法是绝不使用无符号数。另一种方法是确保要使用无符号的地方用的全部是无符号类型的数字,不要有无符号与有符号不匹配的情况出现(尤其是当使用函数时,返回或者传入的参数要与形参匹配)。

0 0
原创粉丝点击