让我有两个字节变量:
byte a= 255;
byte b= 121;
byte c= (byte) (a + b);
Console.WriteLine(c.ToString());
输出:120
请解释一下这是如何增加价值的。我知道它的交叉大小限制为字节但不知道它在这种情况下执行的操作究竟是什么,因为它看起来并不像它的结果那样。
由于
编辑:对不起它的120作为答案。答案 0 :(得分:7)
你溢出255的字节存储,所以它从0开始。
所以:a + b是整数= 376
您的代码相当于:
byte c = (byte)376;
这是添加两个字节返回整数的原因之一。将其转换回字节应该由您自己承担风险。
如果要将整数376存储到字节中,则需要一个数组:
byte[] buffer = BitConverter.GetBytes(376);
正如您所看到的,结果数组现在包含4个字节,这是存储32位整数所必需的。
答案 1 :(得分:4)
当您查看值的二进制表示时,这一点很明显:
var | decimal | binary
----|----------------------
a | 255 | 1111 1111
b | 121 | 0111 1001
| |
a+b | 376 | 1 0111 1000
这会被截断为8位,在将结果转换为byte
时忽略溢出位:
c | | 0111 1000 => 120
答案 2 :(得分:1)
正如其他人所说,你正在四溢; a+b
操作会产生一个int,您明确地将其转换为一个字节。文档是here,基本上是在未经检查的上下文中,通过截断最高有效位来完成转换。
答案 3 :(得分:0)
我猜您的意思是byte c= (byte)(a + b);
在我的结尾,这里的结果是120,这就是我所期望的。
a + b等于376,表示256及以上的所有位都被剥离(因为byte
实际上只保存1个字节),那么120就是你在字节中留下的内容。