为什么是((unsigned int)x)*y ==((unsigned int)(x*y)总是如此?

Yua*_*Wen 4 c++ implicit-conversion

我刚写了这些代码:

int x = -1;//x must be negative
unsigned int y = 1;//y must be positive
bool b;
for(; ; x--, y++){
    b = ((unsigned int)x) * y == ((unsigned int)(x * y));
}
Run Code Online (Sandbox Code Playgroud)

然后我发现这b总是如此.在我看来,((unsigned int)x)*y会溢出,但((unsigned int)(x*y))不会.我真的很难相信这是真的.这只是巧合还是这种现象背后有任何法律?

Col*_*mbo 8

In x * y,x已经转换unsigned为通常的算术转换的结果.§5/ 10:

在此输入图像描述

即你的第一个表达式,(unsigned)(x * y)相当于(unsigned)((unsigned)x * y)相当于(unsigned)x * y- 你的第二个表达式.


请注意,等级unsigned int等于(signed)的等级为int§4.13/ 1.4:

任何无符号整数类型的等级应等于相应的有符号整数类型的等级.