Беззнаковое / подписанное целочисленное сложение с кастингом - PullRequest
0 голосов
/ 20 апреля 2019

В C ++ гарантируется ли, что если я буду использовать подписанные и неподписанные версии целого числа с фиксированной шириной для выполнения операции, я получу тот же результат?То есть, если я сделаю:

uint64_t a = [any number];
uint64_t b = [any number];
uint64_t resultOne = a + b;
uint64_t resultTwo = (uint64_t)(((int64_t) a) + ((int64_t) b));

Гарантируется ли, что resultOne и resultTwo всегда будут выдавать один и тот же вывод независимо от того, какие значения я использую для a и b?

1 Ответ

1 голос
/ 20 апреля 2019

Для типов без знака добавление гарантированно будет изменено: если вы добавите 1 к максимальному uint64_t, вы получите 0.

С типами со знаком, как в C, так и в C ++, перенос - это неопределенное поведение: все может произойти, и на практике компилятор может делать то, чего вы не ожидаете, если у вас включена оптимизация.

Так что нет, это не гарантируется стандартом.

Тем не менее, многие компиляторы дают возможность в качестве расширения стандарта гарантировать завернутое поведение для подписанных типов, и в этом случае ответ - да. Например, см. -fwrapv GCC и Clang.

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