byte b;
int i;
unchecked
{
b = 255 + 255; //overflows
i = 100 + int.MaxValue+100; // works
}
1) 是b表达式(b = 255 + 255;
)因为受到两条冲突规则的影响而导致溢出错误的原因,其中第一条规则R1状态:
A constant-expression (§7.19) of type int can be converted to type sbyte, byte, short, ushort, uint, or ulong, provided the value of the constant-expression is within the range of the destination type.
而第二条规则 R2 指出在未经检查的上下文中允许溢出。
对于 b 表达式,R1 优先于 R2,因此常量表达式 255+ 255
不在目标类型(字节)的范围,R1 会导致错误,即使 R2 允许溢出?
2)
a) 以下是我关于为什么 i 表达式 (i = 100 + int.MaxValue+100;
) 不会导致错误的原因:
1 - 当编译器开始计算 i 表达式时,它不会尝试提升值 100
和 int.MaxValue
以在之前键入 long
执行加法(因此在计算过程中这两个值仍然是 int
类型)
2 - 添加确实会导致溢出,但由于这是在未经检查的上下文中发生的,因此不会抛出任何错误
3 - 由于这两个值没有提升为 long
,因此结果值也是 int
类型,因此结果值在范围内目的地类型
b) 但是如果编译器确实提升了 100
和 int.MaxValue
;在执行加法之前键入 long
,那么 i 表达式会由于违反规则 R1 而导致错误?!
谢谢
最佳答案
是的。常量默认都是int
,所以第二条语句会愉快的溢出,留在int之内。您可以看到,如果您将常量之一设置为 long,它就会失败:
byte b;
int i;
unchecked
{
b = 255 + 255; //overflows
i = 100L + int.MaxValue+100; // fails as well
}
关于c# - 在未经检查的语句中出现溢出错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5626371/