Связь между длиной слова, размером символа, целочисленным размером и байтом

StackOverflow https://stackoverflow.com/questions/698312

  •  22-08-2019
  •  | 
  •  

Вопрос

Какова связь между длиной слова, размером символа, целочисленным размером и байтом в C++?

Это было полезно?

Решение

Стандарт требует, чтобы определенные типы имели минимум размеры (short — не менее 16 бит, int — не менее 16 бит и т. д.), а также то, что некоторые группы типов упорядочены (sizeof(int) >= sizeof(short) >= sizeof(char)).

Другие советы

В C++ символ должен быть достаточно большим, чтобы вместить любой символ из базового набора символов реализации.

int имеет «естественный размер, предложенный архитектурой среды выполнения».Обратите внимание, что это означает, что int делает нет размер должен быть не менее 32 бит.Реализации, где int Обычно 16 бит (например, встроенный в MS-DOS).

Следующее взято из различных частей стандартов C++98 и C99:

  • long int должно быть как минимум такого же размера, как int
  • int должно быть как минимум такого же размера, как short
  • short должно быть как минимум такого же размера, как char

Обратите внимание, что все они могут быть одинакового размера.

Также (при условии реализации дополнения до двух):

  • long int должно быть не менее 32-битного
  • int должно быть не менее 16 бит
  • short должно быть не менее 16 бит
  • char должно быть не менее 8 бит

Стандарт не знает этого «слова», используемого процессорами.Но там говорится, что тип «int» должен иметь естественный размер для среды выполнения.Но даже для 64-битных сред int обычно имеет длину всего 32 бита.Таким образом, «слово» в стандартных терминах не имеет практически никакого общего значения (за исключением, конечно, обычного английского «слова»).

Размер символа — это размер персонажа.Зависит от того, о каком персонаже вы говорите.Типы символов: char, беззнаковый char и знаковый char.Также wchar_t используется для хранения символов, которые могут иметь любой размер (определяется реализацией), но должны использовать один из целочисленных типов в качестве базового типа.Очень похоже на перечисления), тогда как char/signed char или unsigned char должен иметь один байт.Это означает, что в одном байте столько же битов, сколько в одном символе.Если реализация говорит, что один объект типа char имеет 16 бит, то и байт имеет 16 бит.

Теперь байт — это размер, который занимает один символ.Это единица, а не какой-то конкретный тип.В этом нет ничего особенного, просто это устройство, к которому вы можете получить доступ к памяти.То есть у вас нет доступа к указателям на битовые поля, но есть доступ к единицам измерения, начинающимся с одного байта.

«Целый размер» теперь довольно широк.Что ты имеешь в виду?Все значения bool, char, short, int, long и их неподписанные аналоги являются целыми числами.Их диапазон - это то, что я бы назвал «целочисленным размером», и он документирован в стандарте C, который заменен стандартом C++.Для знакового символа диапазон составляет -127 <-> 127, для короткого и целого числа он одинаков и равен -2^15+1 <-> 2^15-1, а для длинного - -2^31+1 < -> 2^31-1.Их беззнаковые аналоги варьируются от 0 до 2^8-1, 2^16-1 и 2^32-1 соответственно.Однако это минимальные размеры.То есть, int не может иметь максимальный размер 2^14 на любой платформе, потому что это, конечно, меньше 2^15-1.Отсюда следует, что для этих значений требуется минимум битов.Для char это 8, для short/int — 16 и для long — 32.Представление с двумя дополнениями для отрицательных чисел не требуется, поэтому отрицательное значение не требуется. -128 вместо -127 например, для подписанного символа.

В стандартном C++ нет типа данных, называемого word или byte.Остальные четко определены как диапазоны.База представляет собой char который имеет CHAR_BITS биты.Наиболее часто используемое значение CHAR_BITS — 8.

sizeof( char) == 1 (один байт) (в c++, в C — не указано)
sizeof( int ) >= sizeof( char )
слово - не тип С++, обычно в компьютерной архитектуре это означает 2 байта

Зависит от того, что вы подразумеваете под отношением.Размер числовых типов обычно кратен размеру машинного слова.Байт есть байт есть байт — 8 бит, ни больше, ни меньше.Я полагаю, что в стандарте символ определяется как один беззнаковый байт (подробнее проверьте свой ARM).

Общее правило таково: не делайте никаких предположений о фактическом размере типов данных.Стандарт определяет отношения между типами, например, «длинное» целое число будет либо того же размера, либо больше, чем «int».Отдельные реализации языка будут выбирать конкретные размеры для удобных для них типов.Например, компилятор для 64-битного процессора будет выбирать размеры, отличные от компилятора для 32-битного процессора.

Вы можете использовать оператор sizeof() для проверки конкретных размеров используемого вами компилятора (в конкретной целевой архитектуре).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top