длинная и длинная реализация в 32-битной машине - PullRequest
17 голосов
/ 01 декабря 2008

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

Ответы [ 5 ]

14 голосов
/ 01 декабря 2008

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

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

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

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

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

9 голосов
/ 01 декабря 2008

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

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

4 голосов
/ 01 декабря 2008

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

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

2 голосов
/ 01 декабря 2008

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

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

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

2 голосов
/ 01 декабря 2008

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

#include <stdint.h>

int32_t n;

и друзья. Это работает и для C ++.

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

struct my_64bit_integer {
    uint32_t low;
    uint32_t high;
};

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

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

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