Почему целочисленный размер варьируется от компьютера к компьютеру?

Опубликовано: 4 Сентября, 2022

В компьютере память состоит из цифровой памяти, в которой хранится информация в двоичном формате, а младшая единица называется битом (двоичной цифрой). Один бит обозначает логическое значение, состоящее из двух состояний: 0 или 1. Бит — это часть двоичной системы счисления. Используя комбинацию этих битов, любое целое число может быть представлено в десятичной системе счисления.

Поскольку цифровая информация хранится в двоичных битах, компьютеры используют двоичную систему счисления для представления всех чисел, таких как целые числа. Байт — это группа из 8 бит. В языках программирования, таких как C, можно объявлять переменные, используя тип этой переменной, поэтому для хранения числовых значений в памяти компьютера мы используем внутреннее количество битов для представления целых чисел (int).

Как целые числа хранятся в памяти?

На приведенном выше рисунке видно, как целое число хранится в основной памяти. На приведенном выше рисунке показано, как десятичное число, т. е. число с основанием 10, преобразуется в двоичное, т. е. в систему счисления с основанием 2, и как именно оно хранится в памяти.

Почему размер целого числа варьируется от компьютера к компьютеру?

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

  1. Цель C и C++ состоит в том, чтобы мгновенно предоставлять код на всех машинах. Если бы компиляторы должны были убедиться, что int может иметь необычный размер для этой машины, могут потребоваться дополнительные инструкции. Почти во всех случаях это не требуется, все, что требуется, это чтобы он был достаточно большим для того, что пользователь намеревается с ним делать.
  2. Одним из преимуществ C и C++ является то, что существуют компиляторы, ориентированные на широкий спектр машин, от небольших 8-битных и 16-битных микроконтроллеров до больших 64-битных многоядерных процессоров. И на самом деле, некоторые 18-, 24- или 36-битные машины тоже. Если какая-то машина имеет 36-битный исходный размер, пользователь не будет очень доволен, если, поскольку так говорит какой-то стандарт, вы получите половину производительности в целочисленной математике благодаря дополнительным инструкциям и не сможете использовать старшие 4 бита. внутр.
  3. Небольшой микропроцессор с 8-битными регистрами часто поддерживает 16-битные сложения и вычитания (и, возможно, также умножение и деление), но 32-битная математика потребует удвоения этих инструкций, а также больше работы для умножения и деления. Таким образом, 16-разрядные целые числа (2 байта) имели бы гораздо больше смысла на таком маленьком процессоре, особенно потому, что память, возможно, тоже не очень велика, поэтому хранение 4 байтов для каждого целого числа может быть пустой тратой времени.
  4. Для 32- или 64-битной машины диапазон памяти предположительно намного больше, поэтому большие целые числа не являются таким большим недостатком, а 32-битные целочисленные операции имеют такую же скорость, как и меньшие, а в некоторых случаях «лучше». ”- например, в x86 16-битная базовая математическая операция, такая как сложение или вычитание, требует дополнительного байта префикса для упоминания «сделайте это 16-битным», поэтому математика с 16-битными целыми числами займет больше места в коде.

Это не всегда верно, но часто верно. Не очень полезно расширять int до 64 бит. Это тратит пространство. При необходимости один может иметь длину 64 бита, а int по-прежнему должен быть 32-битным. В противном случае оставьте long long только для тех случаев, когда требуются 64-битные целые числа. Большинство современных реализаций имеют прежнюю длину 64 бита. Таким образом, существуют 16-разрядные целые числа (короткие), 32-разрядные целые числа (int) и 64-разрядные целые числа (длинные и длинные длинные), все из которых поддерживаются аппаратным обеспечением (в случае x86), что позволяет пользователю выбрать подходящий тип для каждой переменной. Как правило, если нет веских причин для аппаратного обеспечения, бесполезно формировать типы, превышающие их минимальный размер, поскольку программы, совместимые со стандартами, в любом случае не могут ожидать, что они будут больше, и должны правильно работать с минимальным размером.

Почему Int не 16-битный?

На 32-битных платформах они были 32-битными; кодирование инструкций для 16-битных операндов (как для 32-битных, так и для 64-битных) на один байт длиннее, чем для 32-битных операндов. И если 16-битное значение сохраняется во время операции с регистром, оставшаяся часть регистра не может использоваться ни в 32-битном, ни в 64-битном, потому что нет кодирования инструкций для «старшей половины 32-битного регистра». Таким образом, 32 бита — это естественный размер операнда.

Ниже приведена программа на C++ для демонстрации размера целого числа в 64-битной системе:

Ниже приведена программа на C++ для демонстрации размера целого числа в 32-битной (x86) системе:

Выход

2

Преимущества переменного целочисленного размера:

  1. Одним из преимуществ изменения размера является то, что для чтения или записи требуется меньше циклов процессора.
  2. Эффективное использование данной архитектуры зависит от 32-разрядных или 64-разрядных систем.

Недостатки переменного целочисленного размера:

  1. Различия в разных архитектурах не дают программисту четкого представления о размере целых чисел, чтобы принимать решения о типе для дальнейших вычислений.
  2. Это может вызвать различные проблемы с памятью, если оно используется не по назначению, что приводит к поддержке некоторых атак, таких как переполнение буфера.
  3. Целое число переполнение может произойти, если какая-то программа попытается сохранить значение в целочисленной переменной больше, чем максимальное значение, которое может хранить переменная.
  4. Различные размеры могут использовать несколько регистров ЦП. Например, если на 32-битной машине нужно хранить число больше 2^32, то потребуется два регистра, то же самое и на 64-битной машине.