C# 原始静默溢出 - 通过 C# 的 CLR

C# primitive silent overflow - CLR via c#

我正在阅读 Jeffrey Richter 通过 C# 编写的 CLR,在第 115 页上有一个由对基元的算术运算导致的溢出示例。有人可以解释一下吗?

Byte b = 100;
b = (Byte) (b+200); // b now contains 44 (or 2C in Hex).

我理解应该是溢出,因为byte是一个无符号的8位值,但为什么它的值等于44?

A byte 可以表示 0 到 255(含)之间的整数。当你传递一个大于255的值时,比如300,300-256=44的值被存储。发生这种情况是因为一个字节由 8 位组成,每个位可以是 0 或 1。因此您可以使用一个字节表示 2^8=256 个整数,从 0 开始。

实际上,你的数字必须除以256,余数只能用一个字节来表示。

100+200为300; 300 是(以位为单位):

1 0010 1100

其中只保留最后8位,所以:

0010 1100

即:44

300的二进制表示是100101100。那是九位,比 byte 类型多了一位。因此高位被丢弃,导致结果为00101100。当您将此值转换为十进制时,您会得到 44。