代码之家  ›  专栏  ›  技术社区  ›  Chris S

左位移位255(字节)

  •  16
  • Chris S  · 技术社区  · 16 年前

    有人能解释一下为什么以下内容不能编译吗?

    byte b = 255 << 1
    

    错误:

    常量值“510”无法转换为“byte”

    我期待下面的二进制代码:

    1111 1110
    

    类型转换让我很困惑。

    7 回复  |  直到 16 年前
        1
  •  35
  •   Community CDub    8 年前

    C中的数字文本是 int 不是 byte (位移位将由编译器计算,因此只剩下510位)。因此,您尝试将值赋给 字节 这不合适。您可以使用255进行遮罩:

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

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

    您也可以使用 unchecked 作为 lassevk mentioned :

    byte b = unchecked((byte)(255 << 1));
    
        2
  •  8
  •   Steve    16 年前

    您将255移动1位,然后尝试将其分配到一个字节。 255 << 1 is 510 和510不适合一个字节。

        3
  •  5
  •   Michael Burr    16 年前
    byte b = 0xff & (255 << 1);
    
        4
  •  5
  •   Michel de Ruiter    8 年前

    结果 << 运算符是 Int32 不是你放进去的。

    您需要转换移位的结果,而不是输入。此外,它将产生溢出(它大于一个字节后的所有),因此您需要指定您需要一个未选中的强制转换。

    换句话说,这将起作用:

    Byte b = unchecked((Byte)(255 << 1));
    
        5
  •  3
  •   Andrew Hare    16 年前

    你试过铸造它吗?

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

    这是一个有趣的方法-如果用 unchecked 阻止如下:

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

    既然是 未检查的 该值被截断为预期值254。所以用石膏做这个是可能的!

        6
  •  1
  •   Otávio Décio    16 年前
    255 << 1
    

    将为您提供多个字节。

        7
  •  0
  •   sipsorcery    16 年前

    由于<<的优先级高于&您可以保存括号:

    byte b = 255 << 1 & 0xff;