为什么将1添加到byte.MaxValue导致256而不是溢出

时间:2019-02-26 05:55:14

标签: c# overflow

我在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。 我错了吗?

1 个答案:

答案 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));

其他资源

checked (C# Reference)

  

默认情况下,仅包含常量值的表达式会导致   如果表达式产生的值超出   目标类型的范围。如果表达式包含一个或多个   非恒定值,编译器不会检测到溢出。   在以下示例中评估分配给i2的表达式   不会导致编译器错误。