Связь между длиной слова, размером символа, целочисленным размером и байтом
Вопрос
Какова связь между длиной слова, размером символа, целочисленным размером и байтом в 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() для проверки конкретных размеров используемого вами компилятора (в конкретной целевой архитектуре).