Почему число вдруг обнуляется в цикле при увеличении?

Рейтинг: 0Ответов: 1Опубликовано: 13.02.2023

Сделал цикл, в котором просто число возводится в степень.

int n = 10;
int a = 2;

while (n > 0)
{
    a *= a;
    Console.WriteLine(a);
    n--;
}

Цикл проходит 4 итерации, а после умножения 65536 на 65536, переменная обнуляется. Проверял c long. Там цикл проходил ещё одну итерации, а потом снова шли нули. Однако делал эксперимент

long a = long.MaxValue;

Console.WriteLine(a * a * a * a * a * a);

и в нём происходит ожидаемое переполнение типа без обнуления. Почему в цикле переменная обнуляется?

Ответы

▲ 3Принят

Все зависит от того, какое значение попадет в переменную после переполнения типа int. В вашем случае,

65 536 * 65 536 = 4 294 967 296

что в битовом представлении будет равно:

00000001 00000000 00000000 00000000 00000000

Переменная типа int представлена 4 байтами, поэтому если отбросить пятый байт, то выходит, что в переменную будет записано значение, в котором все биты равны 0, отсюда и значение в десятичной форме равно 0.