无符号类型的使用建议

很多地方都提到了无符号数(unsigned):

C语言中无符号类型的一些特性与“直觉”不同,因此,在处理无符号数时要多加小心。

比如下面这个有符号数和无符号数混用的例子:

int array[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
#define TOTAL_ELEMENTS (sizeof(array) / sizeof(array[0]))
 
int main(void)
{
        int d = -1, x;
        ...
 
        if (d <= TOTAL_ELEMENTS - 2)
                x = array[d + 1];
        ...
}

代码没有如预期运行,因为sizeof的返回值类型size_t是一个无符号类型(至少为unsigned int),导致变量d类型提升,变成一个很大的无符号数,从而if判断为假。

下面是一些关于无符号数的使用建议:

比如上例的if判断,可做如下修改:

        if (d <= (int)TOTAL_ELEMENTS - 2)