Left bit shifting 255 (as a byte)

守給你的承諾、 提交于 2019-11-27 09:03:48
Joey

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

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.

byte b = 0xff & (255 << 1);
Lasse Vågsæther Karlsen

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));
Daniel A. White

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!

255 << 1

will give you more than one byte.

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

byte b = 255 << 1 & 0xff;
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!