C#中int与byte类型相加相同数值,为何结果存在差异?
为什么C#中byte与int相加结果有差异?
这本质是C#的数值类型提升规则和byte类型的溢出特性导致的,具体原因如下:
- byte的取值范围限制:byte是8位无符号整数,取值范围固定为
0~255。当数值超出这个范围时,默认情况下会自动截断低8位(溢出),不会报错。 - 算术运算的数值提升:C#规定,对byte、sbyte、short、ushort这类短整型执行算术运算时,编译器会先把它们隐式转换为int类型再计算。也就是说,两个byte相加的过程其实是:先把两个byte转成int,相加得到int结果,再把结果转回到byte(如果你赋值给byte变量的话)。
举个实际例子:byte a = 255; byte b = 1; // 直接赋值给byte的情况: byte c = a + b; // 计算过程是int(255)+int(1)=256,转byte时截断低8位,结果为0 // 转成int相加的情况: int d = (int)a + (int)b; // 结果是256,完全符合预期,因为int范围远大于byte - 溢出检查的影响:默认情况下C#在Release模式下不检查无符号整数的溢出,所以截断会悄悄发生。如果在
checked块中执行赋值,就会直接抛出OverflowException,提醒你数值超出了byte的范围。
内容的提问来源于stack exchange,提问作者Vita
相关产品推荐
相关产品推荐

