C#原语静默溢出-CLR通过C#

C#原语静默溢出-CLR通过C#,c#,.net,byte,C#,.net,Byte,我正在阅读杰弗里·里克特(Jeffrey Richter)的《通过C#的CLR》,在第115页上有一个关于原语算术运算导致溢出的例子。有人能解释一下吗 Byte b = 100; b = (Byte) (b+200); // b now contains 44 (or 2C in Hex). 我知道应该有溢出,因为byte是一个无符号的8位值,但为什么它的值等于44?byte可以表示0到255(包括0和255)之间的整数。当您传递一个大于255的值(如300)时,将存储300-256=44的值

我正在阅读杰弗里·里克特(Jeffrey Richter)的《通过C#的CLR》,在第115页上有一个关于原语算术运算导致溢出的例子。有人能解释一下吗

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

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

byte可以表示0到255(包括0和255)之间的整数。当您传递一个大于255的值(如300)时,将存储300-256=44的值。这是因为一个字节由8位组成,每个位可以是0或1。所以你可以用一个字节来表示2^8=256个整数,从0开始

实际上,你们得把你们的数字除以256。剩余部分只能用一个字节表示。

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

其中,仅保留最后8个,因此:

0010 1100

也就是说:44

300的二进制表示是
100101100
。这是9位,比
字节的空间多一位。因此,较高的位被丢弃,导致结果为
00101100
。当你把这个值转换成十进制时,你会得到44。

我用位:)(+1)做了很好的解释。
0010 1100