Неопределенное поведение при превышении 64 бит - PullRequest
1 голос
/ 15 октября 2008

В моем текущем 32-разрядном приложении я проверяю (очень редко) переполнение, выполняя операции над 64-разрядными целыми числами.

Однако в 64-битных системах стандартное 128-битное целое число не выглядит. Есть ли простой способ проверки на переполнение или способ получения 128-разрядных целых чисел, который работает на всех ОС и компиляторах?

Я пытался использовать GMP в качестве более общего решения, но оно немного тяжелее для моих требований.

Эффективность не так уж важна, нет специфичного для процессора ASM.

Ответы [ 3 ]

3 голосов
/ 15 октября 2008

Большая часть обсуждения в этом вопросе применима:

Как обнаружить целочисленное переполнение?

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

2 голосов
/ 15 октября 2008

этот документ подробно описывает перехват переполнения (в c). Я не знаю, есть ли лучшие способы сделать это в C ++.

1 голос
/ 15 октября 2008

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

Я не могу вспомнить синтаксис operatorX на макушке головы (я давно переключился с C ++ на Java), но пример будет:

int64 myint64::add (int64 a, int64 b) {
    if (MAX_INT64 - a > b) {
        // error condition here.
    }
    return a + b;
}
int64 myint64::mul (int64 a, int64 b) {
    if (MAX_INT64 / a > b) {
        // error condition here.
    }
    return a * b;
}

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

Однако, если вы строите их из базовых арифметических блоков, они будут работать.

...