Почему все типы данных имеют степень 2? - PullRequest
7 голосов
/ 04 марта 2011

Почему все размеры типов данных всегда имеют степень 2?

Давайте рассмотрим два примера:

short int 16
char 8

Почему они не похожи на следующие?

short int 12

Ответы [ 10 ]

11 голосов
/ 04 марта 2011

Это деталь реализации, и это не всегда так.В некоторых экзотических архитектурах используются типы данных, отличные от двух.Например, 36-битные слова были распространены на одном этапе.

Причина, по которой полномочия двух почти универсальны в наши дни, заключается в том, что они обычно упрощают реализацию внутреннего оборудования.В качестве гипотетического примера (я не работаю с оборудованием, поэтому должен признаться, что это в основном догадки), часть кода операции, которая указывает, насколько велик один из его аргументов, может быть сохранена как индекс степени двойкиколичество байтов в аргументе, таким образом, двух битов достаточно, чтобы выразить, какой из 8, 16, 32 или 64 битов является аргументом, и схема, требуемая для преобразования этого в соответствующие сигналы фиксации, будет довольно простой.

3 голосов
/ 04 марта 2011

Размер символов char, short, int, long и т. Д. Зависит от платформы.32-битные архитектуры, как правило, имеют char = 8, short = 16, int = 32, long = 32.В 64-битных архитектурах обычно есть char = 8, short = 16, int = 32, long = 64.

Многие DSP не имеют мощности двух типов.Например, Motorola DSP56k (немного устаревший) имеет 24-битные слова.Компилятор для этой архитектуры (из Tasking) имеет char = 8, short = 16, int = 24, long = 48.Чтобы запутать, они сделали выравнивание char = 24, short = 24, int = 24, long = 48.Это потому, что он не имеет байтовой адресации: минимальная доступная единица измерения составляет 24 бита.Это имеет захватывающее (раздражающее) свойство, включающее много деления / по модулю 3, когда вам действительно необходим доступ к 8-битному байту в массиве упакованных данных.

Вы найдете только не-мощные-2 в ядрах специального назначения, размер которых подбирается в соответствии со специальным шаблоном использования, с преимуществом в отношении производительности и / или мощности.В случае 56k это было связано с тем, что был модуль с множественным сложением, который мог загружать две 24-битные величины и добавлять их к 48-битному результату за один цикл на 3 шинах одновременно.Вся платформа была разработана вокруг него.

Основная причина, по которой большинство архитектур общего назначения использует полномочия 2, состоит в том, что они стандартизируют октет (8-битные байты) как тип минимального размера (кроме флагов).Нет причины, по которой он не мог бы быть 9-битным, и, как указано в другом месте, 24-битные и 36-битные были распространены.Это проникло бы в остальную часть дизайна: если бы x86 был 9-разрядным байтом, у нас было бы 36 строк октетного кэша, 4608 страниц октетов, и 569 КБ было бы достаточно для всех :) У нас, вероятно, не было бы «клевов», так какВы не можете разделить 9-битный байт пополам.

Это сейчас практически невозможно.Очень хорошо, что система, сконструированная таким образом с самого начала, но взаимодействие с данными, генерируемыми 8-битными байтовыми системами, было бы кошмаром.Уже достаточно сложно проанализировать 8-битные данные в 24-битном DSP.

3 голосов
/ 04 марта 2011

Причина, по которой встроенные типы имеют такие размеры, заключается в том, что это то, что процессоры поддерживают изначально, то есть это самый быстрый и простой. Других причин нет.

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

Вы также обычно захотите сгруппировать типы одинакового размера и начать структуру с наибольшими типами (обычно указателями).
Это позволит избежать ненужного заполнения и гарантирует, что у вас нет штрафов за доступ, которые некоторые ЦП имеют некорректно выровненные поля (некоторые ЦП могут даже вызывать исключение при не выровненном доступе, но в этом случае компилятор все равно добавил бы заполнение, чтобы избежать его).

2 голосов
/ 04 марта 2011

Ну, это степени 2, потому что они кратны 8, и это происходит (немного упрощая) из того факта, что обычно атомная единица выделения в памяти - это байт, который ( edit :часто, но не всегда) состоит из 8 битов.

Большие размеры данных создаются с использованием нескольких байтов за раз.Таким образом, вы можете иметь 8,16,24,32 ... размеров данных.

Тогда, ради скорости доступа к памяти, только степени 2 используются как множитель минимального размера (8),таким образом, вы получаете размеры данных по следующим направлениям:

 8 => 8 * 2^0 bits => char
16 => 8 * 2^1 bits => short int
32 => 8 * 2^2 bits => int
64 => 8 * 2^3 bits => long long int
1 голос
/ 04 марта 2011

8 бит - это самый распространенный размер для байта (но не размер only , примеры 9-битных байтов и других размеров байтов найти несложно). Большие типы данных почти всегда кратны размеру байта, следовательно, они обычно равны 16, 32, 64, 128 битам в системах с 8-битными байтами, но не всегда степеням 2, например. 24-битный типичен для DSP, и есть 80-битные и 96-битные типы с плавающей запятой.

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

Есть несколько случаев, когда целочисленные типы должны иметь точную степень двух.Если существуют типы точной ширины в <stdint.h>, такие как int16_t или uint32_t, их ширина должна быть точно такого же размера без дополнения.Математическая функция с плавающей точкой, которая заявляет, что следует стандартным IEEE силам float и double, чтобы быть степенями двух (хотя long double часто нет).В стандартной библиотеке теперь есть дополнительно типы char16_t и char32_t или встроенные в C ++, определенные как типы точной ширины.Действующие требования о поддержке UTF-8 означают, что char и unsigned char должны иметь ширину ровно 8 бит.

На практике много устаревшего кода уже сломалось бы на любой машине, которая не работала.не поддерживает типы шириной 8, 16, 32 и 64 бита.Например, любая программа, которая читает или записывает ASCII или пытается подключиться к сети, обрывается.

Некоторые исторически важные мэйнфреймы и миникомпьютеры имели собственные размеры слов, кратные 3, а не степени двух, особенноDEC PDP-6, PDP-8 и PDP-10.

Это было основной причиной популярности базы 8 в вычислительной технике: поскольку каждая восьмеричная цифра представляла три бита, 9-, 12-, 18- или 36-битный шаблон может быть представлен более аккуратно восьмеричными цифрами, чем десятичный или шестнадцатеричный.Например, при использовании base-64 для упаковки символов в шесть бит вместо восьми каждый упакованный символ занимал две восьмеричные цифры.

Два наиболее заметных наследства этих архитектур сегодня заключаются в том, что по умолчанию экранирование символовтакие как '\123' интерпретируются как восьмеричные, а не десятичные в C, и что разрешения / маски Unix-файлов представлены в виде трех или четырех восьмеричных цифр.

0 голосов
/ 04 марта 2011

В большинстве случаев ваш компьютер пытается сохранить все форматы данных в виде целого кратного (2, 3, 4 ...) или целой части (1/2, 1/3, 1/4 ...)размера машинных данных.Он делает это так, что каждый раз, когда он загружает N слов данных, он загружает целое число битов информации для вас.Таким образом, позже не нужно рекомбинировать части.

Вы можете увидеть это в x86, например:

символ - 1/4 из 32-битных

короткий - 1/2 из 32-битных

int / long - это целые 32 бита

long long - 2x 32 бита

число с плавающей запятой - один 32-битный

double - два32-битное

значение long double может быть в три или четыре раза больше 32-битного, в зависимости от настроек вашего компилятора.Это связано с тем, что для 32-битных машин загружаются 96 битов (три машинных слова).На 64-битных машинах это 1,5 машинного слова, поэтому 128 бит будут более эффективными (без рекомбинации).Фактическое содержание данных long double на x86 составляет 80 битов, поэтому оба они уже дополнены.

И последнее, за исключением того, что компьютер не всегда загружает данные в исходном размере.Сначала он выбирает строку кэша, а затем читает ее в машинных словах.Строка кэша больше, обычно около 64 или 128 байт.Это очень полезно, чтобы в них поместился значимый бит данных, и он не застрял на краю, поскольку для его чтения вам понадобилось бы загрузить две целые строки кэша.Вот почему большинство компьютерных структур имеют степень двойки;он поместится в любой степени хранения двух размеров: наполовину, полностью, вдвое или более - вы гарантированно никогда не окажетесь на границе.

0 голосов
/ 04 марта 2011

Не обязательно, чтобы все типы данных использовали степень 2 в качестве числа представляемых битов.Например, long double использует 80 битов (хотя его реализация зависит от количества выделяемых битов).

Одно преимущество, которое вы получаете, используя степень 2, состоит в том, что могут быть представлены большие типы данных.как поменьше.Например, 4 символа (8 бит каждый) могут составлять целое число (32 бита).Фактически, некоторые компиляторы использовали для моделирования 64-разрядных чисел, используя два 32-разрядных числа.

0 голосов
/ 04 марта 2011

Они не обязательно.На некоторых машинах и компиляторах sizeof(long double) == 12 (96 бит).

0 голосов
/ 04 марта 2011

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

Если вам действительно нужны 12-разрядные целые числа, вы можете использовать bit fields в структурах (или объединениях), например:

struct mystruct
{
    short int twelveBitInt : 12;
    short int threeBitInt  :  3;
    short int bitFlag      :  1;
};

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...