Подтвердить что ты не робот

Длинная реализация в 32-битной машине

В соответствии с стандартом c99 размер long long должен быть не менее 64 бит. Как это реализовано на 32-битной машине (например, добавление или умножение 2 long long s). Кроме того, что эквивалентно long long в С++.

4b9b3361

Ответ 1

В архитектуре IA32 64-разрядное целое реализовано с использованием двух 32-разрядных регистров (eax и edx).

Для С++ существуют эквивалентные для платформы эквиваленты, и вы можете использовать заголовок stdint.h, где он доступен (boost предоставляет вам один).

Ответ 2

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

Как это реализовано? Большинство компьютерных архитектур уже имеют встроенную поддержку многословных дополнений и вычитаний. Они не используют 64-разрядные дополнения напрямую, но используют флаг переноса и специальную команду-add для создания 64-битного добавления из двух 32-битных добавлений.

Такое же расширение существует и для вычитания (перенос называется заимствованием в этих случаях).

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

Существуют архитектуры, у которых вообще нет флагов (некоторые чипы DSP и простые микроны). На этих архитектурах переполнение должно быть обнаружено с помощью логических операций. Арифметика с несколькими словами обычно медленна на этих машинах.

Ответ 3

Как заявили все, 64-разрядное целое обычно реализуется простым использованием двух 32-разрядных целых чисел. Затем умная генерация кода используется для отслеживания переносить и/или брать бит для отслеживания переполнения и соответственно корректировать.

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

Ответ 4

Если вы заботитесь о размерах битов, вы должны использовать

#include <stdint.h>

int32_t n;

и друзей. Это работает и для С++.

64-разрядные номера на 32-битных машинах реализованы, как вы думаете, на 4 дополнительных байта. Поэтому вы можете реализовать свои собственные 64-битные datatype, выполнив что-то вроде этого:

struct my_64bit_integer {
    uint32_t low;
    uint32_t high;
};

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

В stdint.h есть int64_t, который поставляется с моей версией GCC, и в Microsoft Visual С++ у вас также есть тип __int64.

Ответ 5

Следующий стандарт С++ (из-за 2009 года, или, возможно, 2010 год), будет включать в себя тип "длинный длинный". Как упоминалось ранее, это уже широко используется.

Реализация зависит от авторов компилятора, хотя компьютеры всегда поддерживали операции с несколькими точками. Некоторые языки, такие как Python и Common Lisp, требуют поддержки целых чисел с неопределенной точностью. Давным-давно я написал 64-разрядные подпрограммы умножения и разделения для компьютера (Z80), которые могли бы управлять 16-битным сложениями и вычитанием без какого-либо аппаратного умножения.

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