Размер байта (уточнение) - PullRequest
1 голос
/ 27 мая 2011

Я пишу игровой сервер, и это может быть простой вопрос, но я просто хочу кое-что прояснить.

Почему байт (char или unsigned char) может содержать значение 255 (0xFF, которое, я считаю, составляет 2 байта)?Когда я использую sizeof(unsigned char), компилятор говорит мне, что это 1 байт.Это потому, что (в ACSII) он «конвертируется» в символ?

Извините за это плохое объяснение, я не очень хорошо описываю вопрос.

Ответы [ 7 ]

30 голосов
/ 27 мая 2011

Это затрагивает множество предметов, включая историческое значение байта, определение символа C на языке C и математику.

Для начала, байт исторически был многим, но в настоящее время мы почти всегда имеем в виду октет, который составляет 8 бит.Как игра слов, есть также клочок (или часто клочок), который составляет полбайта (не называется прикус).

Математика говорит нам, что при упорядоченной комбинации из 8 1-or-0 значений мы получаем 2<sup>8</sup> = 256 комбинаций.Иногда мы используем это без знака, иногда со знаком, но в любом случае мы хотим иметь 0 в диапазоне;таким образом, диапазон без знака 0..255.Для подписанного диапазона у нас есть больше опций , из которых дополнение к двум является самым популярным;в этом случае мы получаем еще одно отрицательное значение, чем положительное, для диапазона -128..+127.

C ++ наследует символ от C, где определено, что значение sizeof равно 1, что является наименьшимадресуемый размер (т. е. имеющий различные значения адреса с &) и минимальный диапазон -128..127 или 0..255 в зависимости от того, подписан он или нет.Это сводится к тому, что требуется не менее 8 бит или один байт;ровно один байт, если машина его поддерживает.

0xff - это другой способ записи 255. 0x - это способ обозначения константы шестнадцатеричной , поэтому каждая цифра в ней составляет 4 бита (для 16 возможных цифр),эрго клев.Это преобразуется в беззнаковый октет со всеми битами, установленными в 1.

Если для вашего кода имеет значение определенный размер, существует заголовок stdint.h , который определяет типы минимальных и точных размеров, дляоптимизация скорости или размера.

Кстати, ASCII - это 7-битный набор символов.Машины с 7-битными байтами в наше время необычны, и популярны более широкие наборы символов, такие как ISO 8859-1 и UTF-8.

8 голосов
/ 27 мая 2011

0xFF может храниться в 8 битах, что составляет один байт.

sizeof(char) определено так, чтобы всегда возвращать 1, независимо от фактического размера в битах базового типа данных (см. 5.3.3.1действующего стандарта).Размеры всех других типов данных рассчитываются относительно размера char.

4 голосов
/ 27 мая 2011

Когда я использую sizeof (unsigned char), компилятор говорит мне, что это 1 байт.

Размер char [со знаком или без знака] всегда равен 1 какпредписано стандартом C ++.

1 голос
/ 27 мая 2011

Размер символа или знака без знака равен 1 байту согласно стандарту.

Почему разные диапазоны, если одинаковый размер?

1 Byte = 8 bits or 2^8
2^8 = 256

Следовательно,
signed char диапазон от -128 to 127
unsigned char диапазон от 0 to 255

Это потому, что в случаеsigned char один из битов используется для хранения знака, в то время как unsigned char не может быть -ve, этот бит используется для увеличения диапазона.

0 голосов
/ 29 июня 2018

char размер всегда 1, но число битов может отличаться, C определяет макрос CHAR_BIT, который имеет количество бит в символах.Это максимальное максимальное значение, которое может иметь unsigned char: pow(2, CHAR_BIT) - 1.

Более подробная информация: Что такое CHAR_BIT?

0 голосов
/ 27 мая 2011

1 байт равен 8 битам, поэтому в случае

  • со знаком: (1 знак используется для знака, поэтому 2 ^ 7 = 128) он имеет значение от -128 до 127
  • без знака: (2 ^ 8 = 255) он содержит от 0 до 255
0 голосов
/ 27 мая 2011

255, 0xFF - один байт, если он представлен как беззнаковый символ.Вы не можете представлять 255 как подписанный символ.

...