2014-04-13 2 views
7

В C++ вы можете использовать int, который обычно составляет 4 байта. A long long integer обычно составляет 8 байтов. Если процессор был 32 бит, не ограничил бы его 32-разрядными номерами? Почему я могу использовать целое число long long, если оно не поддерживает 64 бита? Может ли alu добавлять большие целые числа или что-то еще?Как 32-разрядный процессор поддерживает 64-битные целые числа?

+0

См. Knuth Vol 2, раздел 4.3 –

ответ

14

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

Например, на x86 можно добавить два неподписанных 64-разрядных чисел (мы предполагаем, что в EDX: EAX и EBX: ECX) что-то вроде этого:

add eax, ecx ; this does an add, ignoring the carry flag 
adc edx, ebx ; this adds the carry flag along with the numbers 
; sum in edx:eax 

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

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

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

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

Это означает, что (по крайней мере, в некоторой степени) ширина слова, поддерживаемая процессором, накладывает ограничение на максимальную тактовую частоту, с которой он может работать. Если кому-то захотелось достаточно плохо, они могли бы построить процессор, который работал, например, с 1024-битными операндами. Однако, если бы они это сделали, у них было бы два варианта: либо запустить его с меньшей тактовой частотой, либо взять несколько часов, чтобы добавить одну пару операндов.

Также обратите внимание, что при расширении таких операндов вам нужно больше хранилища (например, более крупный кеш), чтобы хранить как можно больше операндов, больше ворот для выполнения каждой отдельной операции и т. Д.

Для получения идентичной технологии вы можете иметь 64-разрядный процессор, работающий на частоте 4 ГГц и имеющий, скажем, 4 мегабайта кеша, или 1024-битный процессор, который работал на частоте около 250 МГц и имел, возможно, 2 мегабайт кеша.

Последний, вероятно, был бы победой , если бы большая часть вашей работы была на 1024-битных (или более крупных) операндах. Большинство людей вообще не занимаются математикой в ​​1024-битных операндах. Фактически, 64-битные номера достаточно велики для большинства целей. Таким образом, поддержка больших операндов, вероятно, окажется чистой потерей для большинства людей в большинстве случаев.

+0

Итак, как получилось, что у вас не может быть 128-битных целых чисел? Или даже 256 бит? Я знаю, что для этого есть классы, но почему компьютер не может это сделать в первую очередь? – user3452725

+3

@ user3452725 Они могут, вам просто нужно сказать им, связав эти инструкции по переносу. – Mysticial

+2

@ user3452725: Добавление в основном последовательной операции - добавление двух младших значащих битов генерирует бит результата * и * бит переноса, который используется в качестве ввода при добавлении следующих младших значащих бит. Есть оптимизация, чтобы уменьшить эту зависимость, но в худшем случае вы можете иметь все пути, поэтому это неизбежно. Поэтому, хотя они могут поддерживать более широкие слова в отдельных операциях, это сократит скорость, и большинство людей не часто используют 128-битные или 256-битные номера. Аналогичные соображения относятся к вычитанию, умножению и т. Д. –

3

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

+0

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

+0

Если вы хотите узнать больше, возможно, неплохо изучить код сборки. – Outsider

+1

@ user3452725 целые числа не могут быть округлены, так как они всегда целые числа. – Steve

4

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

Here's a little more на флаг переноса и способ его использования.

4

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

1) Добавить младший 32 бит с использованием обычной команды Сложить. Обратите внимание, будет ли это дополнение генерировать бит «выполнить» (то есть, если в результате на самом деле потребуется 33 бита для представления).

2) Добавьте 32-разрядный бит высокого порядка таким же образом. Если бы выполнялось выполнение бит более низкого порядка, установите бит переноса в этом месте (или, альтернативно, добавьте его к результату после добавления).

0

Вы также можете подумать, что мы использовали для обработки 16 или даже 32-разрядных целых чисел в дни 8-разрядных ЦП. Нет ничего, что ограничивало бы какой-либо конкретный alu от обработки произвольных номеров чисел, кроме пространства памяти, и в конечном итоге я предполагаю терпение пользователя.

Smalltalk, например, всегда обеспечивал произвольные длины целых чисел, начиная с оригинальных Dorados и Altos, что возвращает нас к 1970 году. Хотите точное значение 963! - просто сделай это. Потребуется некоторое время, чтобы отформатировать его для печати.

Смежные вопросы