#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
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实现定义.