请教:为何这段C#代码永远不会返回负值?
问题原因解析
这是C#里无符号byte类型的特性,加上整数强制转换的溢出规则导致的,具体可以拆成这几点看:
运算时自动提升为int类型计算
C#里byte、short这类小整数参与运算时,会先转成int类型再计算。拿你给的例子说:byte.MaxValue是255(转成int),b=254也转成int,index=47本身是int,所以算出来的结果是255-254-47-1 = -47,这是个int类型的负数。强制转byte时的溢出处理
byte是无符号的8位整数,只能存0到255之间的数。把超出范围的int值转成byte时,C#会自动对数值做模256运算——也就是反复加或减256,直到结果落在0-255里。
你的例子里-47加256等于209,所以最终返回的byte值就是209。为什么永远不会返回负值?
因为byte本身就没有负数的取值空间,不管转换前的数值是正还是负,转成byte后都会被映射到0到255的范围内,自然不可能出现负数。
额外提一句:如果在C#里开了checked模式(比如用checked{}包裹代码),这种溢出转换会直接抛异常,但默认编译模式是unchecked,所以会自动做模运算处理。
内容的提问来源于stack exchange,提问作者Ilya Krivenok
相关产品推荐
相关产品推荐

