左移 255 位(作为一个字节)

发布于 2024-07-17 01:40:03 字数 222 浏览 6 评论 0原文

谁能解释为什么以下内容无法编译?

byte b = 255 << 1

错误:

常量值“510”无法转换为“字节”

我期待二进制形式的以下内容:

1111 1110

类型转换困扰了我。

Can anyone explain why the following doesn't compile?

byte b = 255 << 1

The error:

Constant value '510' cannot be converted to a 'byte'

I'm expecting the following in binary:

1111 1110

The type conversion has stumped me.

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

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

发布评论

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

评论(7

放低过去 2024-07-24 01:40:03

C# 中的数字文字是 int,而不是 byte(位移位将由编译器计算,因此仅保留 510)。 因此,您尝试将一个值分配给不适合的byte。 您可以使用 255: 进行掩码,

byte b = (255 << 1) & 0xFF

以将结果再次减少到 8 位。 与 Java 不同,C# 不允许溢出未被检测到。 基本上,当尝试将 510 分配给一个字节时,您有两个明智的选择:要么限制在最大值,然后您将得到 255,要么丢弃不适合的位,在这种情况下您将得到 254。

您还可以使用未选中,如 lassevk 提到

byte b = unchecked((byte)(255 << 1));

Numeric literals in C# are int, not byte (and the bit shift will be evaluated by the compiler, hence only the 510 remains). You are therefore trying to assign a value to a byte which does not fit. You can mask with 255:

byte b = (255 << 1) & 0xFF

to reduce the result to 8 bits again. Unlike Java, C# does not allow overflows to go by undetected. Basically you'd have two sensible options when trying to assign 510 to a byte: Either clamp at the maximum value, then you'd get 255, or throw away the bits that do not fit, in which case you'd get 254.

You can also use unchecked, as lassevk mentioned:

byte b = unchecked((byte)(255 << 1));
葬シ愛 2024-07-24 01:40:03

您将 255 移位 1 位,然后尝试将其分配给一个字节。
<代码> 255 << 1 是 510,而 510 无法容纳在一个字节中。

You are shifting 255 by 1 bit, then trying to assign it to a byte.
255 << 1 is 510, and 510 won't fit in to a byte.

合约呢 2024-07-24 01:40:03

<< 运算符的结果是一个 Int32,而不是您放入其中的内容。

您需要转换移位的结果,而不是输入。 此外,它会产生溢出(它毕竟大于一个字节),因此您需要指定您需要未经检查的强制转换。

换句话说,这将起作用:

Byte b = unchecked((Byte)(255 << 1));

The result of the << operator is an Int32, not what you put into it.

You need to cast the result of the shift, not the input. Additionally, it will produce an overflow (it is larger than a byte afterall), so you need to specify that you need an unchecked cast.

In other words, this will work:

Byte b = unchecked((Byte)(255 << 1));
橪书 2024-07-24 01:40:03
byte b = 0xff & (255 << 1);
byte b = 0xff & (255 << 1);
烟─花易冷 2024-07-24 01:40:03

你尝试过铸造它吗?

byte b = (byte)(255 << 1)

这是一种有趣的方法 - 如果将上面的代码包装在 unchecked 块中,如下所示:

unchecked
{
    byte b = (byte)(255 << 1);
}

由于它是 unchecked ,因此该值将被截断为预期值 254。通过演员阵容可以做到这一点!

have you tried casting it?

byte b = (byte)(255 << 1)

This is an interesting approach - the above code will work if wrapped in a unchecked block like this:

unchecked
{
    byte b = (byte)(255 << 1);
}

Since it is unchecked the value is truncated to the intended value of 254. So it is possible to do this with a cast!

不必在意 2024-07-24 01:40:03
255 << 1

会给你多于一个字节。

255 << 1

will give you more than one byte.

っ〆星空下的拥抱 2024-07-24 01:40:03

并且自从<< 优先级高于 & 您可以保存括号:

byte b = 255 << 1 & 0xff;

And since << has a higher precedence than & you can save the brackets:

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