Непонятный результат выполнения

175
06 апреля 2017, 20:44

Исходный код:

#include <climits>
#include <iostream>
int add(int a, int b)
{
    return a + b;
}
int main()
{
    std::cout << add(INT_MAX, 1) << std::endl;
    return 0;
}

Вывод:

-2147483648

Почему так получилось? искал не нашел ответа.

Answer 1

У Вас произошло переполнение значения int при добавлении 1 к максимальному значению.

Можете попробовать перевести INT_MAX в двоичное представление руками, получите набор единиц и ноль в начале, который отвечает за знак плюс. Добавляете 1 в двоичном виде, и получаете в знаковом разряде 1 вместо 0 и все остальные нули. Если посмотрите на способ педставления в машине отрицательных чисел, то увидите, что этим представляется INT_MIN - 1 и все осталные нули. Посмотрите, например, в Windows калькуляторе.

Answer 2

Если, к примеру, тип int занимает 4 байта и используется система представления целых чисел дополнением до 2, то INT_MAX можно представить в шестнадцатиричном виде следующим образом

7FFFFFFF

то есть все биты кроме знакового бита установлены в единицу.

Если к этому числу прибавить 1, то получится

80000000

то есть число с установленным знаковым битом. Это представление наименьшего отрицательного значения для типа int которое равно INT_MIN.

Это значение и было выведено на консоль в десятичном виде.

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

READ ALSO
Время создания переменной

Время создания переменной

Например, есть искусственный пример:

204
Вектор с шаблонируемым классом

Вектор с шаблонируемым классом

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

264
Можно ли в кострукторе класса проверить некое условие и сразу запустить деструктор, если условие не удовлетворяет?

Можно ли в кострукторе класса проверить некое условие и сразу запустить деструктор, если условие не удовлетворяет?

Можно ли в конструкторе класса проверить некое условие и сразу запустить деструктор, если условие не удовлетворяется? Или же придется бросать...

231
Вопрос по очереди

Вопрос по очереди

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

223