如果除以1,隐式类型转换是否会发生?

Aps*_*psa 1 c c++

#include <stdio.h>

int main()

{
    unsigned int count=1;

    signed int val = -20;

    signed int div=(val/count);

    signed int div1=(val/(signed int)count);

    printf("div %d div1 %d \n",div,div1);
    return 0;
 }
Run Code Online (Sandbox Code Playgroud)

输出:

div -20 div1 -20
Run Code Online (Sandbox Code Playgroud)

但如果count = 5则输出:

div 858993455 div1 -4 
Run Code Online (Sandbox Code Playgroud)

在count = 5的情况下,signed int被隐式转换为unsigned int,为什么不为count = 1

Ant*_*vin 5

signed int div=(val/count);
Run Code Online (Sandbox Code Playgroud)

如果其中一个操作数是int另一个操作数unsigned int,int则转换为操作数unsigned int.所以这里val转换为unsigned int,然后除以count,然后结果转换回int.

也就是说,此表达式被评估为

int div = (int)((unsigned int)val / count);
Run Code Online (Sandbox Code Playgroud)

因此,当count == 1结果保持不变时,但当count == 5结果(unsigned int)val / count变得小于时INT_MAX,所以当转换回int它时不会改变其(大正值)值.

需要注意的是严格来说,即使count == 1结果不必须-20的,因为从转换的结果(unsigned int)-20,以int实现定义.