我正在写一段代码来防止上溢/下溢。在此之前,我尝试:C#Math.Max类型处理
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
来做我的比较?
所以对于'USHORT一个= 0; a- = 1;'与'ushort b = 0不同; b = b-1;'(稍后一个失败),有趣......我一直认为这个类型是由左边的值决定的。 –