我在 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。
我错了吗?
Addition任何小于int
完成于int
。这在标准 ECMA-334 C# 规范 https://www.ecma-international.org/publications/standards/Ecma-334.htm under 数字促销
12.4.7 数字促销
当重载解析规则(§12.6.4)应用于这组
运算符,效果是选择第一个运算符
操作数类型存在哪些隐式转换。 [例子:为了
操作 b * s,其中 b 是字节,s 是短重载
分辨率选择运算符 *(int, int) 作为最佳运算符。因此,
效果是 b 和 s 转换为 int,并且类型
结果是整数。同样,对于操作 i * d,其中 i 是 int
并且 d 是 double,重载决策选择运算符 *(double,
double) 为最佳算子。结束示例]
此外,如果你想捕获溢出,你将需要使用checked https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/checked keyword
Example
byte a = byte.MaxValue;
byte b = 1;
byte c = checked((byte)(a + b));
其他资源
检查(C# 参考) https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/checked
默认情况下,仅包含常量值的表达式会导致
如果表达式生成的值超出范围,则编译器错误
目标类型的范围。如果表达式包含一个或多个
非常量值,编译器不会检测到溢出。
在以下示例中计算分配给 i2 的表达式
不会导致编译器错误。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)