这是一个非常简单的代码。
using System;
class Test
{
static void Main()
{
byte x = byte.Parse(Console.ReadLine());
byte y = byte.Parse(Console.ReadLine());
Console.WriteLine(x + y);
}
}
当你输入123和221时,它输出344。但是应该有溢出,为什么没有发生呢?为什么它没有输出 344 - 255 = 89?
好问题!
根据语言规范,定义了以下数字加法运算符:
未定义字节聚合。所以语言应用了转换,
byte转而int使用int operator +(int x, int y);.为什么选择了 的重载
int,而不是选择了 的uint?让我们回到规范。转换规则在这里描述(我的翻译):
在我们的例子中,最后一点有效,其余的都不适用。
int值在加法之前转换为,结果类型为int.事实上,加法
byte+的结果byte不必是 typebyte。事实上,加法的结果是类型
int,你可以很容易地在其中放置一个数字334。你可以像这样检查这个语句:
会导致错误: