【发布时间】:2013-11-19 14:24:20
【问题描述】:
编译C文件时出现如下错误:
t_memmove.c: In function ‘ft_memmove’:
ft_memmove.c:19: warning: comparison of unsigned expression >= 0 is always true
这是完整的代码,来自cat ft_memmove.c:
#include "libft.h"
#include <string.h>
void *ft_memmove(void *s1, const void *s2, size_t n)
{
char *s1c;
char *s2c;
size_t i;
if (!s1 || !s2 || !n)
{
return s1;
}
i = 0;
s1c = (char *) s1;
s2c = (char *) s2;
if (s1c > s2c)
{
while (n - i >= 0) // this triggers the error
{
s1c[n - i] = s2c[n - i];
++i;
}
}
else
{
while (i < n)
{
s1c[i] = s2c[i];
++i;
}
}
return s1;
}
我确实知道 size_t 是无符号的,因此两个整数都将 >= 0。但是因为我是从另一个中减去一个,所以我不明白。为什么会出现这个错误?
【问题讨论】:
-
两个无符号整数的算术运算结果也是一个无符号整数,因此根据定义大于或等于零。如果在您的示例中
i大于n,则减法的结果将“换行”为(大)正数。您可能应该检查n >= i。