Переполнение в C#



Во время выполнения арифметических операций с целочисленными типами возможна ситуация, при которой итоговый результат выходит за рамки доступных значений результирующего типа (другими словами не может быть корректно представлен и размещён в памяти).



Такая ситуация называется переполнением (overflow) и корнями уходит к арифметике и битовому представлению чисел в computer science.



По умолчанию в C# и .NET при переполнении ведущие биты обнуляются, после чего результат "умещается" в доступных битах. В случае с беззнаковыми типами - большие значения станут меньше, а при переполнении знаковых типов положительные числа станут отрицательными.



Позвольте мне продемонстрировать это поведение на примерах:



🔸 Максимальным значением для беззнакового типа uint является 0xffffffff:



uint u1 = 0xffffffff;

u1 = u1 + 5; // 0x00000004 (перенос)




🔸 int.MaxValue - максимальное значение для знакового типа int:



int n1 = int.MaxValue;

n1 = n1 + 1; // -2147483648 (перенос)




🔸 Минимальное значение для знакового типа short является -32768:



short s1 = short.MinValue;

s1 = (short)(s1 - 1); // 32767 (перенос)




💬 Как я уже упоминал ранее, использовать минимальные и максимальные значения в циклах стоит с осторожностью, иначе это может привести к неожиданным последствиям. Примером тому служит следующий код. Что выведется на экране? Ответ вы сможете найти ниже на странице 😉



#data_types