c# - 在未经检查的语句中出现溢出错误

标签 c#

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 表达式时,它不会尝试提升值 100int.MaxValue 以在之前键入 long执行加法(因此在计算过程中这两个值仍然是 int 类型)

2 - 添加确实会导致溢出,但由于这是在未经检查的上下文中发生的,因此不会抛出任何错误

3 - 由于这两个值没有提升为 long,因此结果值也是 int 类型,因此结果值在范围内目的地类型

b) 但是如果编译器确实提升了 100int.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/

相关文章:

c# - 开源即时通讯工具?

c# - 如何优化此 LINQ 查询以仅执行单个 SQL 命令?

c# - C#去除列表中重复项的方法

c# - 使用 WPF/MVVM Light Toolkit 处理窗口关闭事件

c# - 页面 Web 方法在 Web 服务方法完美调用的 Ajax 调用中不起作用

C# 编程 : Maintaining a List that Associates an ID with Information Quickly

c# - 如何在MVVM中显示WPF数据网格中的数据

c# - 如何判断是通过关闭按钮关闭还是通过 WPF 中的 Application.Shutdown?

c# - 数据绑定(bind) : 'System.Web.UI.Pair' does not contain a property with the name 'First'

c# - C# 中的 Jack Sensing