在返回有符号类型的函数的 return 语句中减去无符号值

问题描述

我遇到过类似这样的简化代码

__int64 fun(unsigned __int64 x,unsigned __int64 y)
{
    return x - y;
}

在 Visual Studio 中,即使 y>x 并且我们有适当的负值,它也能正常工作。但这是 UB 还是有效情况,所有其他编译器也会正确处理吗?

解决方法

它永远不是UB。在上一个 C++ 标准中,它始终是明确定义的:

结果是与源整数模2N一致的目标类型的唯一值,其中N是宽度目标类型。

在以前的一些标准中,它可能是实现定义的:

如果目标类型是有符号的,如果可以用目标类型(和位域宽度)表示,则值不变;否则,该值是实现定义的。

然而,在实践中,每个实现都以2N为模。