C 中的无符号类型有两个主要用途:
在某些情况下,当计算超出类型的范围时,具有将“换行”的值很有用。例如,当计算多种散列或校验和时,在忽略溢出的情况下简单地执行一堆加法或乘法比使用过大的变量和/或条件逻辑来防止溢出要方便得多。
有时,让一个两字节变量能够容纳高达 65,535 而不仅仅是 32,767 的值是有用的;有时将四字节变量增加到 4,294,967,295 很有用,但这种情况不太常见。
在 C 中,需要尝试将 -1 存储到unsigned
变量中以存储(没有任何类型的错误或尖叫)当添加到 +1 时将产生零的值。这对于第一个使用场景非常有用;第二个是不可取的,但是由于 C 从未对有符号整数进行任何类型的溢出捕获,因此它可以被认为是对数字(而不是代数环)的计算时会发生坏事的原理的扩展范围。
与 C 不同,C# 支持数字溢出检测,因此可以将其应用于第二种使用方式,同时仍允许第一种使用方式。不幸的是,该确定是基于已检查或未检查的数字上下文,而不是基于变量、参数或值的类型。因此,如果一个方法要接受一个类型的参数,UInt32
并且在unchecked
上下文中尝试传递一个值 -1 的代码,该方法将把它视为 4,294,967,295 的值。无法将参数标记为“这应该是一个介于 0 和 4,294,967,295 之间的值;如果是其他值,则不管检查/未检查状态如何,请尖叫。因此,让代码接受Int32
if 上限为 2,147,483,647会更安全是否足够,否则Int64
。