c中的unsigned int comparision

时间:2017-02-14 14:32:44

标签: c implicit-conversion unsigned

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值。我不知道为什么会那样

3 个答案:

答案 0 :(得分:6)

  

c的值为4294967295,(strlen(s)-strlen(x))的值为4294967294

(strlen(s)-strlen(x))产生4294967294并非必然。这取决于您系统上SIZE_MAX的值。

如果SIZE_MAX18446744073709551615(通常在64位系统上),则(strlen(s)-strlen(x))将为18446744073709551614,明显大于4294967295(假设{ {1}}是UINT_MAX)。因此,您会看到4294967295正在打印。

使用printf(s);语句查看值并了解:

printf()

答案 1 :(得分:2)

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

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)的值大于已转换为c类型的变量size_t的值。

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

答案 2 :(得分:1)

@Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); ... if (savedInstanceState != null) { //Restore the fragment's state here } } ... @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); //Save the fragment's state here } / intunsigned int类型的这种隐式转换容易出错且难以检测。像PVS-Studio这样的静态代码分析器可以很好地自动发现这些错误。