В компьютерах используются 32-битные или 64-битные процессоры, почему бы не 40-битные или другие числа?
Например, в случае 32-битных процессоров слово имеет 4 байта. Можно ли использовать 5-байтовое слово или другое.
1 ответ
Можно ли также использовать 5-байтовое слово или другое
Да. Вы даже можете использовать всего несколько битов вместо всего байта / слова через битовые поля. Технически компиляторы могут поддерживать любые целочисленные размеры на любых архитектурах, например, 12-битное, 30-битное или 96-битное int на 16-битном компьютере. Фактически Clang только что получил новое расширение для целых чисел с произвольной разрядностью, которое называется _ExtInt
. Смотрите также
- Если 32-битное целое число переполняется, можем ли мы использовать 40-битную структуру вместо 64-битной длинной?
- Какой тип данных C может представлять 40-битное двоичное число?
почему не 40-битные или другие числа?
Производительность сильно пострадает. Нам нужны дополнительные инструкции для работы с неродными целочисленными размерами. Если размер меньше слова, компиляторам необходимо испустить побитовые инструкции, чтобы замаскировать оставшиеся биты. В обратном случае нам нужно несколько инструкций для работы с несколькими словами.
Еще один важный момент - несовпадение. Современные процессоры работают более эффективно, когда адрес переменной кратен ее размеру или, по крайней мере, кратен ширине шины данных / размеру слова. Работать с переменной нечетного размера просто неудобно
Тем не менее, существует множество 32-битных архитектур с 40-битным типом, таких как TI C6000 или TI C5500 DSP.
long
является
- 40 бит или 5 байтов для C6000 COFF
[...] и C5500 имеет 40-битный
long long
Это потому, что эти DSP имеют специальный 40-битный аккумулятор, позволяющий складывать 32-битные числа 256 раз без переполнения. Но почему бы просто не использовать 64-битный аккумулятор? Для этого потребуется ALU гораздо большего размера, потребуется больше энергии и он будет работать медленнее (поскольку большая площадь означает большее расстояние между аппаратными компонентами, а работа с большими числами медленнее, чем с меньшими), что неприемлемо в DSP, который предназначен для обеспечения производительности (и, возможно, также мощность)
... Например, процессор DSP Texas Instruments TMS320C6000 использует 32 бита для представления типа
int
и 40 бит для представления типаlong
(этот выбор не редкость). Те процессоры (обычно DSP), которые используют 24 бита для представления типаint
, часто используют 48 бит для представления типаlong
. Использование 24/48-битных представлений целочисленных типов может быть обусловлено требованиями приложения, когда представление 32/64-битных целочисленных типов не является экономически эффективным.Новый стандарт C (выдержки из материалов): экономический и культурный комментарий
Фактически, 40-битное int очень распространено среди DSP (другими примерами являются Blackfin и SHARC). SHARC даже имеет 80-битный аккумулятор, поэтому вы можете добавлять множество 64-битных значений, не беспокоясь о переполнении
Но для этого не нужна особая архитектура или специальная поддержка компилятора. Вы все равно можете использовать 40-битную переменную, если вам действительно нужно, например, когда вы работаете с огромным массивом, где 64-битные целые числа сделают его слишком большим, чтобы поместиться в основной памяти, и меньшее количество элементов поместится в кеш. Самый простой способ сделать это - отключить выравнивание с#pragma pack
или __attribute__((packed))
struct int40_t {
int64_t : 40;
} __attribute__((packed));
int40_t myArray[200] __attribute__((packed));
или получить доступ к значениям из простого массива char (на основе решения cmm)
unsigned char _5byteInts[5*size+3]; // +3 avoids overfetch of last element
int64_t get5byteInt(size_t index)
{
int64_t v = 0;
memcpy(&v, &_5byteInts[index*5], 5); // little endian
return (v << 24) >> 24;
}
void set5byteInt(size_t index, int64_t value)
{
memcpy(&_5byteInts[index*5], &value, 5); // little endian
}
Но это приведет к снижению производительности на архитектурах без невыровненного доступа. Вы можете упаковать четыре 40-битных int в одну 20-байтовую структуру для лучшего выравнивания.
struct four_int40s {
uint32_t low[4];
uint8_t hi[4];
};
Исторически сложилось так, что было несколько компьютеров с размерами слов, не равными степени двойки, как в этой таблице размеров слов. Однако, в конце концов, люди обнаружили, что адресную арифметику гораздо проще реализовать, когда размер адреса является степенью двойки.
Рассмотрим такую операцию, как "перейти на 14 слов вперед". Если размер слова является степенью двойки, скажем, 64, то схема должна сдвинуть число 14 на log(64)/log(2)=6
и добавить к ip
и это легко сделать за 1 цикл. Однако, если размер слова равен 36, как в IBM 701, то число 14 нужно будет умножить на 36, и это займет больше циклов. Учитывая, что умножение целого числа на размер слова является очень распространенной операцией, замедление будет значительным.