В соответствии с стандартом c99 размер long long
должен быть не менее 64 бит. Как это реализовано на 32-битной машине (например, добавление или умножение 2 long long
s). Кроме того, что эквивалентно long long
в С++.
Длинная реализация в 32-битной машине
Ответ 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-битным сложениями и вычитанием без какого-либо аппаратного умножения.
Вероятно, самый простой способ увидеть, как операция реализована в вашем конкретном компиляторе, - написать образец кода и изучить выход ассемблера, который доступен из всех основных компиляторов, с которыми я работал.