Очень простой вопрос, я прочитал, что GCC поддерживает длинный длинный тип int. Но как сделать математические операции с ним, когда процессор только 32 бит?Длинный длинный int на 32-битных машинах
ответ
Компилятор будет синтезировать математические операции (или использовать вызовы функций), которые используют более одной команды ЦП для выполнения операции. Например, операция добавления добавит компоненты низкого порядка (низкие слова) значений long long
и затем выполнит выполнение этой операции и подаст ее в операцию добавления в словах высокого порядка long long
.
Так следующий код C:
long long a;
long long b;
long long c;
// ...
c = a + b;
может быть представлена последовательность команд, которая выглядит примерно так:
mov eax, [a.low] ; add the low order words
add eax, [b.low]
mov edx, [a.high] ; add the high order words,
adc edx, [b.high] ; including the carry
mov [c.low], eax
mov [c.high], edx
А если на минуту, компиляторы для 8 и 16 бит системы должны были делать этот тип вещей для 16 и/или 32-битных значений задолго до появления long long
.
Скорее всего как класс, а не изначально. таким же образом любой компилятор может/может поддерживать любой большой набор чисел.
Внутренне, тип представлен высоким словом и низким слова, как:
struct long
{
int32 highWord;
uint32_t lowWord;
}
компилятор должен знать, если это 32-разрядная или 64-разрядная среда, а затем выбирает правильный reprenstations из число - если оно 64 бит, это можно сделать изначально, если оно 32 бит, компилятор должен позаботиться о математике между верхним/нижним словом.
Если вы посмотрите в math.h, вы можете увидеть функции, используемые для этого, и использовать их самостоятельно. В дополнение, обратите внимание на разницу между little-endian и big-endian (see wiki), использование зависит от операционной системы.
Говоря о архитектуре 32-разрядной (или 64 или любой другой), обычно является лишь приближением того, на что способен процессор. Обычно вы ссылаетесь только на ширину указателей с этим числом, арифметика может быть совсем другой. Например, архитектура x86 имеет 32-битные указатели, большинство арифметических операций выполняется в 32-битных регистрах, но также имеет встроенную поддержку некоторых базовых 64-разрядных операций.
Также вы не должны следить за тем, чтобы стандартные стандартные типы имели определенную ширину. В частности, длинный длинный не менее 64 бит, но может быть шире. Используйте typedefs int32_t, int64_t, если вы хотите быть уверенно в отношении ширины.
Если вы хотите знать, что ССАГПЗ (или любой другой компилятор) делает с тех пор долго вы должны смотреть в спецификации для конкретной целевой платформы
Это достаточно легко просто компилировать и тестировать, если у вас есть доступная 32-битная система. gcc имеет флаг -S
, который включает выход ассемблера. Вот что он производит на моем 32-битном Intel:
// read two long longs from stack into eax:edx and ecx:ebx
movl 32(%esp), %eax
movl 36(%esp), %edx
movl 24(%esp), %ecx
movl 28(%esp), %ebx
// a+b
addl %ecx, %eax
adcl %ebx, %edx
// a-b
subl %ecx, %eax
sbbl %ebx, %edx
// etc
- 1. Поддерживает ли GCC длинный длинный int?
- 2. длинный длинный ИНТ арифметика
- 3. Тип возврата (длинный + длинный)
- 4. Явный листинг указателя на длинный длинный
- 5. C++: как правильно распечатать длинный длинный int, используя cout
- 6. Как преобразовать длинный двойной в длинный int в c?
- 7. Длинный длинный тип defintion
- 8. Используя длинный Int в PHP
- 9. Получение битов int в длинный
- 10. Почему не длинный int overflow?
- 11. Как использовать Array.copy (массив, длинный, массивный, длинный, длинный) в C#
- 12. Лучше использовать длинный или длинный длинный в 64 бит
- 13. объединить байт в длинный длинный
- 14. Размер мусора длинный длинный тип данных
- 15. оценки «длинный длинный ИНТ» в с
- 16. Arrays.copyOfRange (байт [], длинный, длинный)? в Java
- 17. Как преобразовать длинный длинный массив в C?
- 18. Сумма двух длинного длинного int, когда они дают результат больше, чем длинный длинный int?
- 19. Кастинг void указатель на длинный тип, а не указатель длинный?
- 20. проблематичен выход FMOD (длинный двойной, длинный двойной)
- 21. Java INT = 1 превращается в длинный = 2
- 22. Восстановить длинный от int после прецизионных потерь
- 23. Указать указатель на длинный
- 24. Длинный Двойной на iPhone
- 25. Длинный опрос на IIS
- 26. , которые компиляторы дают самый длинный длинный двойной
- 27. Байт-своп массива байтов в длинный длинный
- 28. Есть ли длинный, чем int Java List?
- 29. Почему (int 10) производит длинный экземпляр?
- 30. Объявление долго длинный массив неподписанных Int размера
Две дополнительные вещи: во-первых, порядок этой структуры зависит от машинного порядка. – Joshua
Во-вторых, функции, которые работают с этой структурой, доступны вам. Они объявлены в математике. – Joshua
thirs 'lowByte' действительно будет' uint32_t' :-P –