如果我除以 1,隐式类型转换不会发生

Will implicit type conversion not happen if I divide by 1?

本文关键字:类型转换 如果      更新时间:2023-10-16
#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;
 }

输出:

div -20 div1 -20

但是如果计数 = 5,则输出:

div 858993455 div1 -4 

在 count=5 中,有符号的 int 已被隐式转换为无符号的 int,为什么不为 count=1

signed int div=(val/count);

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

也就是说,此表达式的计算结果为

int div = (int)((unsigned int)val / count);

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

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

没有"隐式类型转换"这样的东西,类型转换是指显式更改操作数的类型。正确的术语是隐式(类型(转换

C 的基本原则指出,编译器可以随意订购或优化程序,只要它不改变程序的结果。

因此,即使编译器发现除以 1 没有意义并且可以优化掉,它仍然必须考虑隐式类型转换导致的潜在副作用:它无法优化这些副作用,因为程序员可能有意依赖它们。

在您的特定情况下,signed int div=(val/count)将强制val隐式转换为无符号类型。但这并不重要,因为您将结果显示回有符号类型,并且除以 1 的任何内容无论如何都会保持不变。因此,编译器可以优化整个事情,因为无论使用无符号还是有符号算术,结果都是相同的。

但是,如果除以 5,则结果在 -20/5 = -40xFFFFFFEC/5 = 0xFFFFFFFC 之间会变得非常不同。因此,不允许编译器优化隐式转换,因为它会影响结果。

因此,程序员必须知道隐式类型转换规则,以告知他们自己的源代码行之间实际会发生什么。

这是通常的算术转换。 你可以在那里找到规则。

所以实际上,第一个结果是(无符号(-4。 使用补码规则,它将858993455。

您还可以引用隐式转换