c中的unsigned int comparision

Cha*_*kar 2 c unsigned implicit-conversion

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

的值c就是4294967295和的值(strlen(s)-strlen(x))4294967294应打印x,但在打印的S value.I上午没有得到为什么它是这样的

usr*_*usr 6

c的值是4294967295,(strlen(s)-strlen(x))的值是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);
Run Code Online (Sandbox Code Playgroud)

  • @BigBobby代码中没有未定义的行为.所有转换(和促销)都按照C标准的规定进行.请说明"操作无效".顺便说一下,无符号类型*不*溢出(或下溢).他们只是使用减少模数环绕. (3认同)
  • @BigBobby"涉及无符号操作数的计算永远不会溢出,......"C11dr§6.2.59这与比较没有UB. (2认同)
  • @BigBobby也没有"下溢". (2认同)
  • @BigBobby确实,我们的评论说"下溢",但这没有任何区别.仍然没有UB. (2认同)