代码之家  ›  专栏  ›  技术社区  ›  Dr. Rajesh Rolen

超过极限时两个字节相加的结果

c#
  •  0
  • Dr. Rajesh Rolen  · 技术社区  · 14 年前

    我有两个字节的变量:

    byte a= 255;
    byte b= 121;
    
    byte c= (byte) (a + b);
    
    Console.WriteLine(c.ToString());
    

    输出:120

    请解释一下这是如何增加价值的。我知道它跨越了字节的大小限制,但不知道它在这种情况下具体执行什么操作,因为它看起来不像是在截断结果。

    谢谢

    编辑:很抱歉,回答是120。

    4 回复  |  直到 14 年前
        1
  •  7
  •   Darin Dimitrov    14 年前

    255的字节存储溢出,因此它从0开始。

    所以:a+b是一个整数=376

    您的代码相当于:

    byte c = (byte)376;
    

    这就是添加两个字节返回整数的原因之一。将它转换回字节应该由您自己承担风险。

    如果要将整数376存储为字节,则需要一个数组:

    byte[] buffer = BitConverter.GetBytes(376);
    

    如您所见,结果数组现在包含4个字节,这是存储32位整数所必需的。

        2
  •  4
  •   Dirk Vollmar    14 年前

    当您查看这些值的二进制表示时,会发现:

    var | decimal | binary
    ----|----------------------
      a |     255 |   1111 1111
      b |     121 |   0111 1001
        |         |
    a+b |     376 | 1 0111 1000
    

    这将被截断为8位,在将结果强制转换为 byte :

      c |         |   0111 1000 => 120
    
        3
  •  1
  •   Chris Shaffer    14 年前

    正如其他人所说,你已经满溢了 a+b 操作产生一个int,显式转换为一个字节。文件是 here ,基本上是在未检查的上下文中,通过截断最重要的位来完成转换。

        4
  •  0
  •   Øyvind Bråthen    14 年前

    我想你是说 byte c= (byte)(a + b);

    在我看来,结果是120,这是我所期望的。

    a+b等于376,表示256及以上的所有位都被剥离(因为 byte 实际上只有1个字节),那么120就是你的字节内剩下的。