当Byte溢出时实际发生了什么?

ImJ*_*mes 16 c# byte carryflag

当Byte溢出时实际发生了什么?

说我们有

byte byte1 = 150; // 10010110  
byte byte2 = 199; // 11000111
Run Code Online (Sandbox Code Playgroud)

如果我们现在做这个添加

byte byte3 = byte1 + byte2;
Run Code Online (Sandbox Code Playgroud)

我想我们最终会得到byte3 = 94,但究竟发生了什么?我是否以某种方式覆盖了其他内存或者这完全无害?

小智 12

这很简单.它只是添加并以超过8位的数字出现.第九位(一个)只是'掉落'而你剩下的8位形成数字94.

(是的,这是无害的)

  • 这在 C# 中是不正确的,给定的代码实际上不会编译。 (2认同)

Gav*_*n H 7

顶部位将被截断.它对任何其他记忆都没有害处,只会对意外结果造成伤害.


Ian*_*ley 7

在C#中,如果你有

 checked { byte byte3 = byte1 + byte2; }
Run Code Online (Sandbox Code Playgroud)

它会抛出溢出异常.代码unchecked默认编译.正如其他答案所说,价值将"环绕".即byte3 = (byte1 + byte2) & 0xFF;


Hog*_*gan 5

进位标志设置...但除了结果不是你所期望的,应该没有不良影响.


Oli*_*rth 5

通常(并且确切的行为将取决于语言和平台),结果将采用模256进行.即150 + 199 = 349. 349 mod 256 = 93.

这不应该影响任何其他存储.


Arm*_*yan 5

既然您已经标记了C#,C++和C的问题,我将回答有关C和C++的问题.在签名类型的c ++溢出中,包括sbyte(我相信,signed char在C/C++中)会导致未定义的行为.但是对于无符号类型,例如byte(unsigned char在C++中),结果取模2 n,其中n是无符号类型中的位数.在C#中,第二个规则成立,如果签名类型在checked块中,则会生成异常.我可能在C#部分错了.


Mar*_*ell 5

溢出在 C# 中是无害的 - 你不会溢出内存 - 你只需得到结果的最后 8 位。如果您希望这是一个例外,请使用“checked”关键字。另请注意,您可能会发现 byte+byte 给出 int,因此您可能需要转换回 byte。