Введение
Проблема в целочисленном переполнении. Если он переполняется, он возвращается к минимальному значению и продолжается оттуда. Если он становится недостаточным, он возвращается к максимальному значению и продолжается оттуда. На изображении ниже показан одометр. Я использую это для объяснения переполнения. Это механический переполнение, но все же хороший пример.
В одометре, max digit = 9
превышение максимального означает 9 + 1
, что переносится и дает 0
; Однако нет более высокой цифры, которую можно было бы изменить на a 1
, поэтому счетчик сбрасывается на zero
. Вы уловили идею - сейчас на ум приходят «целочисленные переполнения».
Самый большой десятичный литерал типа int - 2147483647 (2 31 -1). Все десятичные литералы от 0 до 2147483647 могут появляться везде, где может появиться литерал int, но литерал 2147483648 может появляться только как операнд унарного оператора отрицания -.
Если при целочисленном сложении происходит переполнение, то результатом являются младшие биты математической суммы, представленные в некотором достаточно большом формате с дополнением до двух. Если происходит переполнение, то знак результата не совпадает со знаком математической суммы двух значений операндов.
Таким образом, 2147483647 + 1
переполняется и оборачивается -2147483648
. Следовательно int i=2147483647 + 1
, будет переполнено, что не равно 2147483648
. Кроме того, вы говорите «он всегда печатает 0». Это не так, потому что http://ideone.com/WHrQIW . Ниже эти 8 чисел показывают точку, в которой он вращается и переполняется. Затем он начинает печатать нули. Кроме того, не удивляйтесь, насколько быстро он вычисляет, современные машины быстры.
268435456
536870912
1073741824
-2147483648
0
0
0
0
Почему целочисленное переполнение "оборачивается"
Исходный PDF