Представление целых чисел в памяти ПК примеры того, как компьютер может складывать

Обновлено: 07.07.2024

Если этот диапазон недостаточно велик для обработки предполагаемых значений, необходимо использовать больший размер. Например, слово (16 бит) может использоваться для представления \(2^\) или 65 536 различных значений, а двойное слово (32 бита) может использоваться для представления \(2^\) или 4 294 967 296 различных значений. числа. Таким образом, если вы хотите сохранить значение 100 000, потребуется двойное слово.

Как вы помните из C, C++ или Java, целочисленное объявление (например, int ) — это одно двойное слово, которое можно использовать для представления значений между \(-2^\) (−2 147 483 648) и + \(2^\) - 1 (+2 147 483 647).

В следующей таблице показаны диапазоны, связанные со стандартными размерами:

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

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

Например, диапазон байтов без знака может быть представлен с помощью числовой строки следующим образом:

截屏2021-07-18 下午4.10.19.jpg
< /p>

Например, диапазон байтов со знаком также может быть представлен с помощью числовой строки следующим образом:

截屏2021-07-18 下午4.10.43.jpg
< /p>

То же самое относится к полусловам и словам с большим диапазоном значений.

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

Например, когда значения без знака и со знаком находятся в перекрывающемся положительном диапазоне (от 0 до +127):

  • Байтовое представление \(12_\) со знаком равно 0x0\(C_\)
  • Байтовое представление \(-12_\) также равно 0x0\(C_\)

Когда значения без знака и со знаком выходят за пределы перекрывающегося диапазона:

  • Байтовое представление \(-15_\) со знаком равно 0x\(F1_\)
  • Байтовое представление \(241_\) также равно 0x\(F1_\)

Это совпадение может вызвать путаницу, если типы данных не определены четко и правильно.

Дополнение до двух

Ниже описано, как найти представление дополнения до двух для отрицательных значений (не положительных значений).

Чтобы получить дополнение числа до двух:

  1. дополнить единицу (отрицать)
  2. добавить 1 (в двоичном формате)

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

Пример

9 (8 + 1) = 00001001
Шаг 1 11110110
Шаг 2 11110111
-9 (в шестнадцатеричном формате) F7
< td >-12 (в шестнадцатеричном формате)
12 (8 + 4) = 00001100< /td>
Шаг 1 11110011
11110100
F4

Примечание: должны быть указаны все биты для заданного размера, в данном примере byte.

Пример

Чтобы найти размер слова (16 бит), используйте представление в дополнении до двух от -18 и -40.

18 (16 + 2) = 0000000000010010
Шаг 1 1111111111101101
Шаг 2 1111111111101110
-18 (hex) 0xFFEE
40 (32 + 8) = 0000000000101000
Шаг 1 1111111111010111
Шаг 2 11111111111011000
-40 (hex) 0xFFD8

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

Вклады и атрибуции

Эта страница находится под лицензией CC BY-NC-SA, ее автором, ремиксом и/или куратором выступил Эд Йоргенсен. Подробная история версий изменений исходного контента доступна по запросу.

Прочитайте эти разделы о представлении целых и действительных чисел.Ранее вы читали о системах счисления и представлении чисел, используемых для вычислений. Это даст вам возможность просмотреть этот материал. Архитектура компьютера включает компоненты, которые выполняют функции хранения данных, передачи данных от одного компонента к другому, вычислений и взаимодействия с внешними по отношению к компьютеру устройствами. Данные хранятся в виде единиц, называемых словами. Слово состоит из ряда битов, обычно, в зависимости от компьютера, 32 бита или 64 бита. Слова продолжают становиться длиннее, с большим количеством битов. Инструкции также хранятся в словах. Ранее вы видели примеры того, как инструкции хранятся в слове или словах. Теперь вы увидите, как числа хранятся в словах.

Целые числа

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

Целые числа обычно хранятся в 16, 32 или 64 битах, причем 16-битное становится все реже, а 64-битное — все чаще. Основная причина этого увеличения заключается не в изменении характера вычислений, а в том, что для индексации массивов используются целые числа. По мере роста размера наборов данных (в частности, при параллельных вычислениях) требуются более крупные индексы. Например, в 32 битах можно хранить числа от нуля до . Другими словами, 32-битный индекс может адресовать 4 гигабайта памяти. До недавнего времени этого было достаточно для большинства целей; в наши дни потребность в больших наборах данных привела к необходимости 64-битной индексации.

Когда мы индексируем массив, нужны только положительные целые числа. В общих целочисленных вычислениях, конечно, нам также необходимо учитывать и отрицательные целые числа. Существует несколько способов реализации отрицательных целых чисел. Самое простое решение — зарезервировать один бит в качестве знакового бита, а оставшиеся 31 (или 15, или 63; с этого момента мы будем считать стандартом 32 бита) использовать оставшиеся 31 бит для хранения абсолютной величины.< /p>


< бр />

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

Схема, которая используется чаще всего, называется дополнением до 2, где целые числа представлены следующим образом.

  • Если , используется обычный битовый шаблон для m.
  • Если , то представлен битовым шаблоном для .


< /p>

Некоторые наблюдения:

  • Между битовыми шаблонами для положительных и отрицательных целых чисел нет перекрытия, в частности, существует только один шаблон для нуля.
  • Положительные числа имеют нулевой начальный бит, отрицательные числа имеют установленный начальный бит.

Упражнение 3.1. Для «наивной» схемы и схемы с дополнением до 2 для отрицательных чисел дайте псевдокод для сравнительного теста m и давайте посмотрим, что происходит при вычислении .

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

  • Случай: . Так как и является допустимым битовым шаблоном. Более того, это представление отрицательного числа в виде битового шаблона, поэтому мы действительно можем выполнять вычисления как беззнаковую операцию над строковыми представлениями m и n.
  • Случай: . Здесь мы это наблюдаем. Так как это число и, следовательно, не является законным выражением отрицательного числа. Однако если мы сохраним это число в 33 бита, мы увидим, что это правильный результат плюс один бит в 33-й позиции. Таким образом, выполняя сложение без знака и игнорируя бит переполнения, мы снова получаем правильный результат.

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

Представление действительных чисел

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

Вещественные числа хранятся по схеме, аналогичной так называемой "научной нотации", где число представлено как значащее и показатель степени, для Экземпляр 6.022 x 10 23 , который имеет значащие 6.022 с точкой основания после первой цифры и показателем степени 23. Это число обозначает

Мы вводим основание, маленькое целое число, 10 в предыдущем примере и 2 в числах компьютеров, и записываем числа в его терминах в виде суммы t членов:

где находятся компоненты

  • бит знака: один бит, определяющий, является ли число положительным или отрицательным;
  • является основой системы счисления;
  • цифры мантиссы или значащие – расположение точки счисления (десятичной точки в десятичных числах) неявно предполагается сразу после первой цифры;< /li>
  • t – длина мантиссы;
  • показатель степени; обычно и

Обратите внимание, что для целого числа существует явный бит знака; знак экспоненты обрабатывается по-разному. Из соображений эффективности e не является числом со знаком; вместо этого оно рассматривается как число без знака, превышающее определенное минимальное значение. Например, битовый шаблон для числа ноль интерпретируется как e = L.

Некоторые примеры

Давайте рассмотрим некоторые конкретные примеры представлений с плавающей запятой. Основание 10 — наиболее логичный выбор для потребления человеком, но компьютеры бинарны, поэтому здесь преобладает основание 2. Старые мейнфреймы IBM группировали биты для представления в шестнадцатеричном формате.



Из них наиболее распространены форматы одинарной и двойной точности. Мы обсудим их в разделе 3.2.4 и далее.

Двоично-десятичный

Десятичные числа не нужны в научных вычислениях, но они полезны в финансовых расчетах, где расчеты с деньгами должны быть абсолютно точными. Двоичная арифметика здесь находится в невыгодном положении, поскольку такие числа, как 1/10, являются повторяющимися дробями в двоичном формате. При конечном числе битов в мантиссе это означает, что число 1/10 не может быть точно представлено в двоичном виде. По этой причине в старых мейнфреймах IBM использовались двоично-десятичные схемы, которые фактически стандартизируются в редакциях IEEE754 [4]; см. также раздел 3.2.4. Немногие процессоры в наши дни имеют аппаратную поддержку BCD; одним из примеров является IBM Power6.

В схемах BCD одна или несколько десятичных цифр кодируются несколькими битами. Самая простая схема будет кодировать цифры 0 . . . 9 в четырех битах. Преимущество этого заключается в том, что в двоично-десятичном коде каждая цифра легко идентифицируется; его недостаток в том, что около 1/3 всех битов тратится впустую, поскольку 4 бита могут кодировать числа 0 . . . 15. Более эффективные кодировки будут кодировать 0 . . . 999 в десяти битах, что в принципе может хранить числа 0 . . . 1023. Хотя это эффективно в том смысле, что теряется несколько битов, идентификация отдельных цифр в таком числе требует некоторого декодирования.

Тройные компьютеры

Было проведено несколько экспериментов с тернарной арифметикой [2, 8, 9].

Ограничения

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

Переполнение: наибольшее число, которое мы можем сохранить, равно , а наименьшее число (в абсолютном смысле) равно ; все, что больше первого или меньше второго, вызывает состояние, называемое переполнением.

Недополнение: ближайшее к нулю число равно . Вычисление, результат которого меньше (по абсолютной величине), вызывает состояние, называемое потерей значимости. Фактически, большинство компьютеров используют нормализованные числа с плавающей запятой: первая цифра d1 считается отличной от нуля; см. раздел 3.2.3 для получения дополнительной информации об этом. В этом случае любое число меньше вызывает недополнение. Попытки вычислить меньшее число иногда обрабатываются с помощью ненормализованных чисел с плавающей запятой (процесс, известный как постепенная потеря значимости), но обычно это в десятки или сотни раз медленнее. чем вычисления с обычными числами с плавающей запятой. На момент написания этой статьи только IBM Power6 имел аппаратную поддержку постепенной потери значимости.

Тот факт, что только небольшое количество действительных чисел может быть точно представлено, является основой области анализа ошибок округления. Мы рассмотрим это более подробно в следующих разделах.

Нормализованные числа и машинная точность

Общее определение чисел с плавающей запятой, уравнение (3.1), оставляет нас с проблемой, что числа имеют более одного представления. Например, . Поскольку это излишне усложнило бы компьютерную арифметику, например, при проверке равенства чисел, мы используем нормализованные числа с плавающей запятой. Число нормализовано, если его первая цифра отлична от нуля. Подразумевается, что часть мантиссы равна .

Практическое значение в случае двоичных чисел заключается в том, что первая цифра всегда равна 1, поэтому нам не нужно хранить ее явно. В стандарте IEEE 754 это означает, что каждое число с плавающей запятой имеет форму

Теперь мы можем уточнить ошибку представления. Номер машины — это представление всех x в интервале вокруг него. С t цифрами в мантиссе это интервал чисел, которые отличаются от x t + 1-й цифрой. Для части мантиссы мы получаем:


Рисунок 3.1. Арифметика одинарной точности

Машинную точность можно определить по-другому: это наименьшее число, которое можно прибавить к 1, чтобы 1 + имел представление, отличное от 1. Небольшой пример показывает, как выравнивание показателей степени может сдвинуть слишком маленький операнд, чтобы он эффективно игнорируется в операции сложения:



Еще один способ взглянуть на это — заметить, что если отношение x и y слишком велико, результат будет идентичен х.

Машинная точность — это максимально достижимая точность вычислений: не имеет смысла требовать точности более 6 или около того цифр в одинарной точности или 15 — в двойной.

Упражнение 3.3. Напишите небольшую программу, которая вычисляет машинный эпсилон. Есть ли какая-то разница, если вы установите низкий или высокий уровень оптимизации компилятора? Можете ли вы найти другие причины, по которым это вычисление может пойти не так?

Стандарт IEEE 754 для чисел с плавающей запятой

Несколько десятилетий назад такие вопросы, как длина мантиссы и поведение операций округления, могли отличаться у разных производителей компьютеров и даже у моделей одного производителя. Очевидно, это была плохая ситуация с точки зрения переносимости кодов и воспроизводимости результатов. Стандарт IEE 754 2 кодифицировал все это, например, предписывая 24 и 53 бита для мантиссы в арифметике с одинарной и двойной точностью, используя последовательность хранения знакового бита, экспоненты, мантиссы. Это, например, облегчает сравнение чисел.

Стандарт также объявил поведение округления «точным округлением»: результатом операции должна быть округленная версия точного результата.

Выше (раздел 3.2.2) мы видели явления переполнения и потери значимости, то есть операции, приводящие к непредставимым числам. Существует еще одна исключительная ситуация, с которой необходимо разобраться: какой результат должен быть возвращен, если программа запрашивает недопустимые операции, такие как ? Стандарт IEEE 754 имеет для этого два специальных значения: Inf и NaN для «бесконечности» и «не числа». Если в выражении появляется NaN, все выражение будет оцениваться как это значение. Правило для вычислений с Inf немного сложнее [43].

Перечень значений всех битовых комбинаций двойной точности IEEE 754 приведен на рис. 3.1. Обратите внимание, что для нормализованных чисел первой отличной от нуля цифрой является 1, которая не сохраняется, поэтому битовая комбинация интерпретируется как

В настоящее время почти все процессоры соответствуют стандарту IEEE 754, за редкими исключениями. Например, графические процессоры Nvidia Tesla не соответствуют стандартам одинарной точности. Обоснованием этого является то, что двойная точность — это «научный» режим, а одинарная точность, скорее всего, используется для графики, где точное соответствие не имеет большого значения.

Читайте также: