我正在编写一段代码来防止 ushort 溢出/下溢。在此之前,我尝试:
ushort a = 0; //ushort.MinValue
a -= 1; //returns 65535 (ushort.MaxValue)
然后我编写真正的代码,我希望这会“失败”(无法检测到下溢):
ushort oldValue, rate, delta;
ushort newValue = Math.Max(ushort.MinValue, oldValue - rate * delta);
有趣的是,一个错误(CS0266)阻止我构建它。虽然我希望 C# 将使用ushort Max(ushort, ushort)重载,但它正在使用int Max(int, int)重载并且ushort值会自动转换为int。当然,当我明确地将结果转换ushort为此工作正常时。
这让我想,C# 是否检测到可能发生下溢,所以它int用来为我做比较?