为什么 C# 中的字节减法需要强制转换?

发布于 2024-07-22 02:48:31 字数 456 浏览 4 评论 0原文

我必须使用 WinForms 遵循 VS2008 .net 3.5 中的代码:

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 是整数类型...那么为什么我需要进行强制转换?

I have to following code in VS2008 .net 3.5 using WinForms:

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

When I leave the "(byte)" off the last line of code, I get a compiler error saying it "Cannot implicitly convert type 'int' to 'byte'." If everything is of type byte and byte is an integer type... then why do I need to have the cast?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(8

过潦 2024-07-29 02:48:32

因为减法将强制为整数。 我记得,byte 是 C# 中的无符号类型,因此减法可以将您带出字节域。

Because subtraction is coercing up to an integer. As I recall, byte is an unsigned type in C#, so subtraction can take you out of the domain of bytes.

奈何桥上唱咆哮 2024-07-29 02:48:32

这是因为字节减法的结果不适合一个字节:

byte - byte = (0..255) - (0..255) = -255..255

That's because the result of a byte subtraction doesn't fit in a byte:

byte - byte = (0..255) - (0..255) = -255..255
最冷一天 2024-07-29 02:48:32

字节算术 默认情况下会生成 int 值。

Arithmetic on bytes results in an int value by default.

弄潮 2024-07-29 02:48:32

由于字节算术默认返回整数,因此在两种可能的分配中,较窄的零类型(字节)将提升为 int(oColor.r 的类型 - 百分比)。 因此操作的类型是 int。 如果没有强制转换,编译器将不允许您将较宽的类型分配给较窄的类型,因为这是一个有损操作。 因此,除非您明确表示“我知道我正在丢失一些数据,但没关系”,否则您会收到错误。

Because arithmetic on bytes returns integers by default so of the two possible assignments the narrower type of zero (byte) is promoted to int (that of oColor.r - percent). Thus the type of the operation is an int. The compiler will not, without a cast, allow you to assign a wider type to a narrower type, because it's a lossy operation. Hence you get the error, unless you explicitly say "I know I'm losing some data, it's fine" with the cast.

秋意浓 2024-07-29 02:48:32

这是因为 byte 减法返回一个 int。 实际上,任何对字节的二进制算术运算都会返回 int,因此需要进行强制转换。

This is because byte subtraction returns an int. Actually any binary arithmetic operations on bytes will return an int, so the cast is required.

束缚m 2024-07-29 02:48:32

因为sbyte、byte、ushort、short的算术运算会自动转换为int。 最合理的原因是此类操作可能会溢出或下溢。

因此,在三元运算中,最终的 oColor.R - 百分比实际上会产生一个 int,而不是一个字节。 所以该操作的返回类型是int。

Because arithmetic operations on sbyte, byte, ushort, and short are automatically converted to int. The most plausible reason for this is that such operations are likely to overflow or underflow.

Thus, in your ternary operation, the final oColor.R - percent, actually results in an int, not a byte. So the return type of the operation is int.

笑忘罢 2024-07-29 02:48:32

因为赋值运算符右侧的算术表达式默认计算结果为 int。 在您的示例中,percent 默认为 int。 您可以在 MSDN 页面上了解更多相关信息。

Because the arithmetic expression on the right-hand side of the assignment operator evaluates to int by default. In your example percent defaults to int. You can read more about it on the MSDN page.

挽清梦 2024-07-29 02:48:32

FWIW,java还将bytes提升为int。

FWIW, java also promotes bytes to int.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文