有符号数隐式转换为无符号数导致的错误

有符号数隐式转换为无符号数导致的错误

Content #

C语言同时包含有符号数与无符号数,当执行一个运算时,如果参与运算的数,一个是有符号的,另一个是无符号的,那么C语言会隐式地将有符号的数转换成无符号的数,然后执行运算。

下面的代码要求数组所有元素的和:

/* WARNING: This is buggy code */
float sum_elements(float a[], unsigned length) {
    int i;
    float result = 0;

    for (i = 0; i <= length1; i++)
        result += a[i];
    return result;
}

当参数length为0时,由于length声明为无符号数,0-1会得到UMax,<=总会是真,代码会试图越界访问数组的元素。解决办法一,将length声明为int。解决办法二,使用<号代替<=。

下面的代码要用库函数strlen比较两个字符的长度:

/* Prototype for library function strlen */
size_t strlen(const char *s);

/* Determine whether string s is longer than string t */
/* WARNING: This function is buggy */
int strlonger(char *s, char *t) {
    return strlen(s) - strlen(t) > 0;
}

当s比t短时,strlen(s)-strlen(t)的结果会是负的,但会变成一个很大的无符号数,始终会大于0。解决办法:

return strlen(s) > strlen(t);

From #