Why is a cast required for byte subtraction in C#?
我必须使用winforms在vs2008.net 3.5中执行以下代码:
1 2 3 4 5 6 7 8 | byte percent = 70; byte zero = 0; Bitmap copy = (Bitmap)image1.Clone(); ... Color oColor = copy.GetPixel(x, y); byte oR = (byte)(oColor.R - percent < zero ? zero : oColor.R - percent); |
当我把"
因为减法最多只能强制一个整数。我记得,字节是C中的无符号类型,因此减法可以将您从字节域中去掉。
这是因为字节减法的结果不适合字节:
1 | byte - byte = (0..255) - (0..255) = -255..255 |
默认情况下,字节算术会产生一个int值。
因为字节算术在默认情况下返回整数,所以在两个可能的赋值中,更窄的零(字节)类型被提升为int(ocolor.r-percent的类型)。因此,操作的类型是int。如果没有强制转换,编译器将不允许您将更宽的类型分配给更窄的类型,因为这是一个有损操作。因此,您会得到错误,除非您明确地说,"我知道我正在丢失一些数据,这是很好的"与演员。
因为对sbyte、byte、ushort和short的算术运算会自动转换为int。最可能的原因是这些运算可能会溢出或下溢。
因此,在三元运算中,最终的ocolor.r%实际上会产生一个int,而不是一个字节。所以操作的返回类型是int。
这是因为
尝试运行此C代码:对象O=(字节)(1);o=(int)o;你期待什么?现在尝试:
我认为这是对的:
Eric Lippert says,"I don't think of bytes as"numbers"; I think of them as patterns of bits that could be interpreted as numbers, or characters, or colors or whatever. If you're going to be doing math on them and treating them as numbers, then it makes sense to move the result into a data type that is more commonly interpreted as a number."
< /块引用>
也许字节比int更接近char。
因为赋值运算符右侧的算术表达式的默认值为int。在您的示例中,
percent 默认为int 。您可以在msdn页面上阅读更多关于它的信息。FWW,Java也促进字节到int。