为什么C#中的字节与其他整型types不同,被命名为byte和sbyte?

我只是翻阅规范,发现字节是奇怪的。 其他的则是短暂的,短暂的,诠释的,微不足道的,长期的和超长的。 为什么这个字节和字节的命名而不是字节和ubyte?

这是一个语义问题。 当你想到一个字节时,你通常(至less我会这样认为)从0-255的8位值。 所以这就是byte 。 对二进制数据不太常见的解释是-128到127的有符号值( sbyte )。

对于整数,从签名值的angular度来思考更直观,这就是基本名称风格所代表的。 u前缀然后允许访问较不常见的无符号语义。

types“字节”,没有任何其他形容词,通常是无符号的,而types“int”,没有任何其他形容词,经常被签名的原因是无符号的8位值往往更实际(因此广泛使用)比带符号的字节,但大于types的无符号整数通常更具实用性(因此被广泛使用)。

有一个共同的语言学原则,如果一个“事物”有两种types,即“通常”和“不寻常”,那么没有形容词的“事物”一词就意味着“通常的事物”。 术语“不寻常的事物”被用来指exceptiontypes。 遵循这个原则,由于无符号的8位数量比有符号的数字更广泛地使用,没有修饰符的术语“字节”是指无符号的风格。 相反,由于有符号整数的大小比它们的无符号等价物更广泛地使用,所以诸如“int”和“long”这样的术语指的是签名的flavor。

至于这种使用模式背后的原因,如果一个人正在对一定数量的数字进行math计算,那么除了比较之外,这些数字是有符号的还是无符号的都是无关紧要的。 有些时候,将它们视为有符号的方式是很方便的(例如,更加自然,比如说,将数字加1就是添加65535),但是绝大多数情况下,声明要签名的数字并不需要除了执行比较或将数字扩展到更大的大小外,编译器的任何额外工作。 事实上,如果有的话,有符号整数运算可能比无符号整数运算更快(因为无符号整数运算在溢出的情况下是可预测的,而无符号math运算是不可行的)。

相比之下,由于在执行任何math运算之前必须将8位操作数扩展为“int”types,因此编译器必须生成不同的代码来处理有符号和无符号操作数。 在大多数情况下,已签名的操作数将需要比未签名的更多的代码。 因此,在8位值是有符号还是无符号无关紧要的情况下,使用无符号值通常更有意义。 此外,较大types的数字通常被分解成8位值的序列或者从这样的序列重构。 8位无符号types比8位有符号types更容易。 由于这些原因,除了有符号的8位值之外,无符号的8位值的使用更为普遍。

请注意,在C语言中,“char”是一个奇怪的情况,因为C字符集内的所有字符都需要翻译为非负值(所以需要使用带有EBCDIC字符集的8位字符types的机器“char”是无符号的),但是需要一个“int”来保存一个“char”可以容纳的所有值(所以“char”和“int”都是16位的机器需要有“char”签)。