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_MAX
是 18446744073709551615
(通常在 64 位系统上),那么 (strlen(s)-strlen(x))
将是 18446744073709551614
,这显然大于 4294967295
(假设 UINT_MAX
是 4294967295
)。因此,您会看到 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 int
到size_t
类型的隐式转换容易出错且难以检测。 PVS-Studio 等静态代码分析器非常擅长自动查找此类错误。
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_MAX
是 18446744073709551615
(通常在 64 位系统上),那么 (strlen(s)-strlen(x))
将是 18446744073709551614
,这显然大于 4294967295
(假设 UINT_MAX
是 4294967295
)。因此,您会看到 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 int
到size_t
类型的隐式转换容易出错且难以检测。 PVS-Studio 等静态代码分析器非常擅长自动查找此类错误。