【发布时间】:2012-06-06 14:20:14
【问题描述】:
我正在编写一段代码来防止 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为我做比较?
【问题讨论】:
-
所以对于
ushort a=0; a-=1;和ushort b=0; b=b-1;是不同的东西(后来失败了),有趣……我一直以为类型是由左值决定的。
标签: c# overflow type-conversion underflow