c中的无符号整数比较

unsigned int comparision in c

int main()
{
    unsigned int c = -1;
    char *s = "Abc";
    char *x = "defhe";
    ((strlen(s)-strlen(x))>c)? printf(s): printf(x);
}

c 的值是 4294967295(strlen(s)-strlen(x)) 的值是 4294967294 它应该打印 x 但它正在打印 s value.I 不明白为什么会这样

the value of c is 4294967295 and the value of (strlen(s)-strlen(x)) is 4294967294

(strlen(s)-strlen(x)) 不一定会产生 4294967294。这取决于您系统上 SIZE_MAX 的值。

如果 SIZE_MAX18446744073709551615(通常在 64 位系统上),那么 (strlen(s)-strlen(x)) 将是 18446744073709551614,这显然大于 4294967295(假设 UINT_MAX4294967295)。因此,您会看到 printf(s); 被打印出来。

使用 printf() 语句查看值并理解:

printf("%zu %u\n", strlen(s)-strlen(x), c);

您似乎使用格式说明符 %u 输出了表达式 strlen(s)-strlen(x),例如像这样

printf( "%u\n", ( unsigned int )( strlen(s)-strlen(x)));
printf( "%u\n", c );

在这种情况下,输出确实等于

4294967294
4294967295

但是,如果您使用转换为类型 size_t 和格式说明符 %zu 来输出这些表达式,您将得到

printf( "%zu\n", strlen(s)-strlen(x));
printf( "%zu\n", ( size_t ) c );

18446744073709551614
4294967295

因此表达式 strlen(s)-strlen(x) 的值大于转换为类型 size_t 的变量 c 的值。

如果 sizeof( size_t ) 等于 sizeof( unsigned int ),您可以获得预期的结果。

这种从int / unsigned intsize_t 类型的隐式转换容易出错且难以检测。 PVS-Studio 等静态代码分析器非常擅长自动查找此类错误。