首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在未检查语句中获取溢出错误

在未检查语句中获取溢出错误
EN

Stack Overflow用户
提问于 2011-04-11 19:22:08
回答 3查看 158关注 0票数 2
代码语言:javascript
运行
复制
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表达式时,它不会在执行加法之前将值100int.MaxValue提升为long类型(因此,在计算过程中,这两个值仍然是int类型)

2-加法确实会导致溢出,但由于这种情况发生在未经检查的上下文中,因此不会引发错误。

由于这两个值没有被提升为long,因此产生的值也是int类型的,因此结果值在目标类型的范围内。

但是,如果编译器确实促进了100int.MaxValue;在执行加法之前输入long,那么我的表达式就会因违反规则R1而导致错误?!

萨克斯

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-04-11 19:28:59

是。默认情况下,常量都是int,因此第二条语句将很高兴地溢出并停留在int中。如果将其中一个常量设置为长,则可以看到它失败:

代码语言:javascript
运行
复制
byte b;
int i;

unchecked
{
    b = 255 + 255; //overflows
    i = 100L + int.MaxValue+100; // fails as well
}
票数 1
EN

Stack Overflow用户

发布于 2011-04-11 19:28:54

使用要添加到整数的字节,然后将其转换为字节,从而在转换(隐式)时造成溢出。对于整数溢出,只需重置从int.MinValue开始,因此结果将是int i = int.MinValue + 199;

编辑:以下是可能的

代码语言:javascript
运行
复制
 byte b1 = (byte)255;
 byte b2 = (byte)255;
 byte b = (byte)(b1 + b2);

这是因为这两个数字都是以字节形式存储的,并且和在运行时被转换成常量表达式(因为编译器不知道b1和b2是常量)。

票数 1
EN

Stack Overflow用户

发布于 2011-04-11 19:37:21

我认为关键是以下代码仍然“在目标类型的范围内”

代码语言:javascript
运行
复制
i = 100 + int.MaxValue + 100

溢出后,我将计算为-2147483449,这是一个有效的整数。

当添加255到255时,结果是510 (一个整数),它远远超出了字节类型的有效范围。这里没有溢出。

希望这有帮助

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5626371

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档