在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那样的有符号类型,这样在涉及升级混合类型的复杂细节时,不必担心边界情况。只有在使用位段和二进制掩码时,才可以用无符号数。应该在表达式中使用强制类型转换,使操作数均为有符号数或者为无符号数,这样就不比由编译器来选择结构的类型。