在C语言中,在不涉及整数提升的情况下,将无符号值指定为充当“包装”抽象代数环的成员(因此,对于任何X和Y,XY将产生一个唯一值,当将其添加到Y时,它将产生X ),而有符号整数类型在计算保持在一定范围内时被指定为表现为整数,并且在计算超出该范围时可以执行任何操作。但是,C#中的数字语义完全不同。在检查的数值上下文中,有符号和无符号类型的行为都类似于整数,只要计算在范围内即可,而OverflowException
在不处于计算范围时则抛出该整数。在不受约束的上下文中,它们的行为都像代数环。
通常,只有Int32
在需要打包或拆包东西以进行紧凑的存储或运输时,才值得使用小于任何数据类型的唯一值。如果一个人需要存储十亿个正数,并且它们都在0到100的范围内,则每个使用一个字节而不是四个字节可以节省1.5 GB的存储空间。那是一大笔钱。但是,如果一段代码总共需要存储数百个值,则将每个值设为一个字节而不是四个字节将节省大约600个字节。可能不值得打扰。
对于无符号类型,只有在执行信息交换或将数字细分时才真正有用。例如,如果需要对96位整数进行数学运算,则对三个无符号32位整数的组进行计算可能比对带符号整数组进行计算要容易得多。否则,在大多数情况下,有符号的32位或64位值的范围将不足,但是相同大小的无符号值就足够了。