我只是翻阅规范,发现字节是奇数。其他的很短,ushort,int,uint,long和ulong。为什么这个sbyte和byte的命名而不是byte和ubyte?
答案 0 :(得分:62)
这是一个语义问题。当你想到一个字节时,你通常(至少我)会想到0到255之间的8位值。那就是byte
。对二进制数据的不太常见的解释是-128到127的带符号值(sbyte
)。
使用整数,根据有符号值进行思考更为直观,因此这就是基本名称样式所代表的含义。然后u
前缀允许访问不太常见的无符号语义。
答案 1 :(得分:8)
没有任何其他形容词的类型“byte”通常是无符号的,而没有任何其他形容词的类型“int”经常被签名的原因是无符号8位值通常更实用(因此广泛使用)使用的)比有符号字节,但更大类型的有符号整数通常比这种类型的无符号整数更实用(因而广泛使用)。
有一个共同的语言原则,如果“事物”有两种类型,“通常”和“不寻常”,没有形容词的“事物”一词意味着“通常的事物”;术语“不寻常的东西”用于指不寻常的类型。遵循该原则,由于无符号8位量的使用比带符号的更广泛,因此没有修饰符的术语“字节”指的是无符号的味道。相反,由于较大尺寸的有符号整数比无符号等价物更广泛使用,因此“int”和“long”等术语指的是带符号的风格。
至于这种使用模式背后的原因,如果一个人对一定数量的数字进行数学运算,通常无关紧要 - 在比较之外 - 数字是有符号还是无符号。有时候将它们视为已签名是很方便的(例如,考虑在数字上加-1而不是添加65535就更自然了)但是在大多数情况下,声明要签名的数字并不需要编译器的任何额外工作,除非是执行比较或将数字扩展到更大的大小。实际上,如果有的话,有符号整数数学可能比无符号整数数学更快(因为无符号整数数学需要在溢出的情况下可预测地表现,而无符号数学不是)。
相比之下,由于在对它们执行任何数学运算之前必须将8位操作数扩展为类型'int',因此编译器必须生成不同的代码来处理有符号和无符号操作数;在大多数情况下,签名操作数将需要比无符号操作数更多的代码。因此,在8位值是有符号还是无符号无关紧要的情况下,使用无符号值通常更有意义。此外,较大类型的数量通常被分解为8位值的序列或者从这样的序列重构。使用8位无符号类型比使用8位有符号类型更容易进行此类操作。由于这些原因,除了其他原因之外,无符号8位值的使用频率远高于带符号的8位值。
请注意,在C语言中,“char”是一个奇怪的情况,因为C字符集中的所有字符都需要转换为非负值(因此使用带有EBCDIC字符的8位字符类型的机器set需要“char”为unsigned),但需要“int”来保存“char”可以容纳的所有值(因此“char”和“int”都是16位的机器需要具有“ char“被签名。”