Неопределенное поведение при превышении 64 бит

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

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

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

Эффективность не слишком важна, не зависит от процессора-ASM.


person Chris Jefferson    schedule 15.10.2008    source источник


Ответы (3)


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

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

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

person Michael Burr    schedule 15.10.2008

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

person Draemon    schedule 15.10.2008
comment
В C++ я бы использовал шаблоны вместо макросов в этом документе. Устраните необходимость в typeof(). - person Justsalt; 15.10.2008

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

Я не могу вспомнить синтаксис оператора X навскидку (я давно перешел с 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;
}

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

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

person paxdiablo    schedule 15.10.2008