C#原语静默溢出-CLR通过C#
我正在阅读杰弗里·里克特(Jeffrey Richter)的《通过C#的CLR》,在第115页上有一个关于原语算术运算导致溢出的例子。有人能解释一下吗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的值
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
也就是说:44300的二进制表示是
100101100
。这是9位,比字节的空间多一位。因此,较高的位被丢弃,导致结果为00101100
。当你把这个值转换成十进制时,你会得到44。我用位:)(+1)做了很好的解释。
0010 1100