我在C#中有一段简单的代码,当向类型的MaxValue加1时显示溢出错误。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
byte a = byte.MaxValue;
byte b = 1;
Console.WriteLine("Max+1 is : {0}", a+b);
Console.ReadLine();
}
}
}
但是它不会产生溢出和错误的结果,而是会生成正确的值:256 为什么? 而C#中字节变量的最大值为255。 我错了吗?
答案 0 :(得分:3)
int
中完成小于int
的任何操作的加法。 Standard ECMA-334 C# specification在数字促销
下对此进行了说明12.4.7数字促销
当过载解析规则(第12.6.4节)应用于此组 运算符,效果是选择第一个运算符 操作数类型存在哪些隐式转换。 [示例:对于 操作b * s,其中b是字节,而s是短的重载 分辨率选择运算符*(int,int)作为最佳运算符。从而, 结果是b和s转换为int,并且类型为 结果是整数。同样,对于操作i * d,其中i是int 并且d为double,重载分辨率选择运算符*(double, 最佳)。结束示例]
此外,如果要捕获溢出,则需要使用checked
关键字
示例
byte a = byte.MaxValue;
byte b = 1;
byte c = checked((byte)(a + b));
其他资源
默认情况下,仅包含常量值的表达式会导致 如果表达式产生的值超出 目标类型的范围。如果表达式包含一个或多个 非恒定值,编译器不会检测到溢出。 在以下示例中评估分配给i2的表达式 不会导致编译器错误。