byte b;
int i;
unchecked
{
b = 255 + 255; //overflows
i = 100 + int.MaxValue+100; // works
}1)是b表达式(b = 255 + 255;)由于受到两个冲突规则的影响而导致溢出错误的原因,其中第一个规则R1声明:
类型的常量表达式(§7.19)可以转换为s字节、字节、短、ushort、uint或ulong类型,条件是常量表达式的值在目标类型的范围内。
而第二条规则R2指出,在未经检查的上下文中,允许溢出。
对于b表达式,R1优先于R2,因此由于常量表达式255+ 255不在目标类型(即字节)的范围内,即使R2允许溢出,R1也会导致错误?
2)
( a)关于我的表达式(i = 100 + int.MaxValue+100;)为什么不会导致错误,我的推理如下:
当编译器开始计算i表达式时,它不会在执行加法之前将值100和int.MaxValue提升为long类型(因此,在计算过程中,这两个值仍然是int类型)
2-加法确实会导致溢出,但由于这种情况发生在未经检查的上下文中,因此不会引发错误。
由于这两个值没有被提升为long,因此产生的值也是int类型的,因此结果值在目标类型的范围内。
但是,如果编译器确实促进了100和int.MaxValue;在执行加法之前输入long,那么我的表达式就会因违反规则R1而导致错误?!
萨克斯
发布于 2011-04-11 19:28:59
是。默认情况下,常量都是int,因此第二条语句将很高兴地溢出并停留在int中。如果将其中一个常量设置为长,则可以看到它失败:
byte b;
int i;
unchecked
{
b = 255 + 255; //overflows
i = 100L + int.MaxValue+100; // fails as well
}发布于 2011-04-11 19:28:54
使用要添加到整数的字节,然后将其转换为字节,从而在转换(隐式)时造成溢出。对于整数溢出,只需重置从int.MinValue开始,因此结果将是int i = int.MinValue + 199;
编辑:以下是可能的
byte b1 = (byte)255;
byte b2 = (byte)255;
byte b = (byte)(b1 + b2);这是因为这两个数字都是以字节形式存储的,并且和在运行时被转换成常量表达式(因为编译器不知道b1和b2是常量)。
发布于 2011-04-11 19:37:21
我认为关键是以下代码仍然“在目标类型的范围内”
i = 100 + int.MaxValue + 100溢出后,我将计算为-2147483449,这是一个有效的整数。
当添加255到255时,结果是510 (一个整数),它远远超出了字节类型的有效范围。这里没有溢出。
希望这有帮助
https://stackoverflow.com/questions/5626371
复制相似问题