【发布时间】:2019-04-11 17:52:32
【问题描述】:
在另一个线程中,有人问为什么在 C# 中添加两个 ushort 值会引发错误。例如
ushort x = 4;
ushort y = 23;
ushort z = x+y; // ERROR cannot implicitly convert int to ushort
在该线程上,人们认为加号 + 运算符默认采用两个整数,这是一种有助于避免算术溢出的语言功能。但是我在以下函数中遇到了同样的错误:
public RGB(ushort red, ushort green, ushort blue)
{
// this class RGB has three ushort fields: r, g, and b
r = red % ((ushort)256);
g = green % ((ushort)256);
b = blue % ((ushort)256);
}
编译器出错并显示“无法将类型 'int' 隐式转换为 'ushort'。存在显式转换...”。但是在这里,模 % 运算符防止溢出的论点根本没有任何意义:如果 x 和 y 是 ushort 值,则 x%y < max(x,y),因此没有溢出到整数的风险。那么为什么会出现这个错误呢?
【问题讨论】:
标签: c# integer-overflow