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

有符号数到无符号数的隐式强制类型转换导致了某些非直观的行为。这些非直观的行为经常导致程序错误,并且这种包含隐式强制类型转换细微的错误很难被发现。
下面两个例题说明了某些由于无符号数隐式强制类型转换造成的细微错误。
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。为了避免这类错误的一种方法是绝不使用无符号数。另一种方法是确保要使用无符号的地方用的全部是无符号类型的数字,不要有无符号与有符号不匹配的情况出现(尤其是当使用函数时,返回或者传入的参数要与形参匹配)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值