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