Виды целочисленного переполнения при вычитании

StackOverflow https://stackoverflow.com/questions/3982787

  •  09-10-2019
  •  | 
  •  

Вопрос

Я снова пытаюсь изучить C ++, используя SAMS, научите себя C ++ за 21 день (6 -е изд.). Я пытаюсь пройти через это очень тщательно, убедившись, что я понимаю каждую главу (хотя я уже знаком с языками c-syntax).

Рядом с началом главы 5 (список 5.2) есть пункт о бессмысленном целочисленном переполнении. На основании их примера я написал это:

#include <iostream>

int main () {
    unsigned int bignum = 100;
    unsigned int smallnum = 50;
    unsigned int udiff;
    int diff;
    udiff = bignum - smallnum;
    std::cout << "Difference (1) is " << udiff << "\n";
    udiff = smallnum - bignum;
    std::cout << "Difference (2) is " << udiff << "\n";
    diff = bignum - smallnum;
    std::cout << "Difference (3) is " << diff << "\n";
    diff = smallnum - bignum;
    std::cout << "Difference (4) is " << diff << "\n";
    return 0;
}

Это дает следующий выход, который не удивительно для меня:

Difference (1) is 50
Difference (2) is 4294967246
Difference (3) is 50
Difference (4) is -50

Если я изменю программу так, чтобы линия объявила bignum читает вместо этого unsigned int bignum = 3000000000; тогда выходной

Difference (1) is 2999999950
Difference (2) is 1294967346
Difference (3) is -1294967346
Difference (4) is 1294967346

Первый из них, очевидно, в порядке. Число 1294967346 объясняется тем фактом, что 1294967346 это точно 2^32 - 3000000000. Анкет Я не понимаю, почему вторая строка не читает 1294967396, из -за 50, внесенных smallnum.

Третий и четвертая строка Я не могу объяснить. Как появляются эти результаты?

РЕДАКТИРОВАТЬ: Для третьей строки - дает ли он этот результат, просто найдя модуло решения 2^32 Это вписывается в диапазон значений, разрешенных для подписанного Int?

Это было полезно?

Решение

2 ^ 32 - (!) 3000000000 = 1294967296

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top