关于.NET:为什么C#中的字节减法需要强制转换?

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);

当我把"(byte)"从最后一行代码中去掉时,我得到一个编译器错误,它说"不能隐式地将类型"int"转换为"byte"。"如果所有的东西都是byte"类型,并且byte是整数类型……那我为什么需要演员阵容呢?


因为减法最多只能强制一个整数。我记得,字节是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。


这是因为byte减法返回int。实际上,在bytes上的任何二进制算术运算都将返回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。