Почему байты в С# называются байтом и sbyte в отличие от других интегральных типов?

Я просто просматривал спецификацию и обнаружил, что байт нечетный. Другие короткие, ushort, int, uint, long и ulong. Почему это имя sbyte и byte вместо байта и ubyte?

Ответ 1

Это вопрос семантики. Когда вы думаете о байте, вы обычно (по крайней мере, я) думаем о 8-битном значении от 0-255. Итак, что byte. Менее распространенная интерпретация двоичных данных - это знаковое значение (sbyte) от -128 до 127.

С целыми числами он более интуитивно понятен в терминах подписанных значений, так что то, что представляет собой основной стиль имени. Префикс u затем позволяет получить доступ к менее распространенной беззнаковой семантике.

Ответ 2

Причина, по которой тип "байт", без какого-либо другого прилагательного, часто является неподписанным, в то время как тип "int", без какого-либо другого прилагательного, часто подписывается, заключается в том, что неподписанные 8-битные значения часто более практичны (и, следовательно, широко используются), чем подписанные байты, но целые числа со знаком более крупных типов часто более практичны (и, следовательно, широко используются), чем целые числа без знака таких типов.

Существует общий лингвистический принцип: если "вещь" происходит в двух типах: "обычная" и "необычная", термин "вещь" без прилагательного означает "обычную вещь"; термин "необычная вещь" используется для обозначения необычного типа. Следуя этому принципу, поскольку 8-битные количества без знака более широко используются, чем подписанные, термин "байт" без модификаторов относится к неподписанному вкусу. И наоборот, поскольку знаковые числа большего размера более широко используются, чем их беззнаковые эквиваленты, термины типа "int" и "long" относятся к подписанным ароматам.

Что касается причин таких шаблонов использования, если вы выполняете математику на числах определенного размера, обычно это не имеет значения - вне сравнений - независимо от того, подписаны ли цифры или нет. Бывают случаи, когда удобно рассматривать их как подписанные (более естественно, например, говорить о том, как добавить -1 к числу, чем добавить 65535), но по большей части декларирование номеров, которые должны быть подписаны, не требует любая дополнительная работа для компилятора, за исключением случаев, когда вы выполняете сравнение или расширяете номера до большего размера. В самом деле, если что-либо, подписанная целочисленная математика может быть быстрее, чем беззнаковая целочисленная математика (так как беззнаковая целочисленная математика должна вести себя предсказуемо в случае переполнения, тогда как беззнаковая математика не является).

В отличие от этого, поскольку 8-битные операнды должны быть расширены, чтобы ввести "int" перед выполнением любой математики, компилятор должен сгенерировать другой код для обработки подписанных и неподписанных операндов; в большинстве случаев для подписанных операндов потребуется больше кода, чем беззнаковые. Таким образом, в тех случаях, когда не имеет значения, было ли подписано 8-битное значение или без знака, часто имеет смысл использовать значения без знака. Кроме того, числа более крупных типов часто разлагаются в последовательность из 8-битных значений или восстанавливаются из такой последовательности. Такие операции проще с 8-битными неподписанными типами, чем с 8-разрядными типами подписей. По этим причинам, среди прочих, неподписанные 8-битные значения используются гораздо чаще, чем подписанные 8-битные значения.

Обратите внимание, что в языке C "char" является нечетным случаем, так как все символы в наборе символов C необходимо перевести как неотрицательные значения (поэтому машины, использующие 8-разрядный тип char с набором символов EBCDIC требуется, чтобы "char" был без знака), но требуется "int" для хранения всех значений, которые может удерживать "char" (поэтому машины, где оба "char" и "char" , int "равны 16 бит, чтобы иметь подпись" char ".