您的位置:首页 > 编程语言

编程中使用无符号类型潜在的问题

2014-04-24 09:25 183 查看
       在C和C++中,无符号类型的数和有符号类型的数做算术运算时,一般会将有符号的数默认转化成无符号的数,比如无符号整数和有符号整数算术运算时,有符号整数默认转化成无符号整数,但是这存在着巨大的问题,当有符号整数为负数时,比如为-1,它转化成无符号整数时是一个非常大的数,往往会对运算带来意想不到的结果。

#include <iostream>

using namespace std;

int array[] = {1, 3, 5, 7, 9};
#define TOTAL_ELEMENTS ( ( sizeof(array) ) / ( sizeof(*array) ) )

int main()
{
int d = -1, x;

if(d <= TOTAL_ELEMENTS-2)
{
x = array[d+1];
cout<<x<<endl;
}

return 0;
}


       这个程序的if中的判断语句将为假,因此程序什么也不会输出。因为sizeof()  返回的是无符号整数,if语句字signed int 和unsigned int 之间测试相等性,d被升级为unsigned int类型,是一个非常大的正整数,因此表达式为假。

       对无符号类型的建议:

      尽量不要在你的代码中使用无符号类型,以免增加不必要的复杂性。尽量使用int那样的有符号类型,这样在涉及升级混合类型的复杂细节时,不必担心边界情况。只有在使用位段和二进制掩码时,才可以用无符号数。应该在表达式中使用强制类型转换,使操作数均为有符号数或者为无符号数,这样就不比由编译器来选择结构的类型。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: