如下段代码:
int array[] = {1,2,3,4,5,6,7};#define TOTAL_ELEMENTS (sizeof(array) / sizeof(array[0]))int main()
{int d = -1, x;/* ... */if (d <= TOTAL_ELEMENTS - 2){x = array[d + 1];}/* ... */
}
TOTAL_ELEMENTS所定义的值是unsigned int 类型(sizeof()返回值类型为无符号),if语句中,d被升级为unsigned int 类型,-1 转换为无符号数的结果是一个非常巨大的正整数,因而表达式值为false,如何修正?只需对TOTAL_ELEMENTS进行强制类型转换:
if (d <= (int)TOTAL_ELEMENTS -2)
总结:尽量不要使用无符号类型,尤其是不要因为无符号数不存在负值而用其来表示数量,尽量使用像Int那样的有符号数,这样在涉及混杂类型运算转换的时候,不必担心边界情况,只在使用位段和二进制掩码时,才使用无符号数,使用的时候不要由编译器来选择结果的类型,应该明确地在表达式中强制转换成两者统一的类型或者自己希望的类型。