Переполнение в C#
Во время выполнения арифметических операций с целочисленными типами возможна ситуация, при которой итоговый результат выходит за рамки доступных значений результирующего типа (другими словами не может быть корректно представлен и размещён в памяти).
Такая ситуация называется переполнением (overflow) и корнями уходит к арифметике и битовому представлению чисел в computer science.
По умолчанию в C# и .NET при переполнении ведущие биты обнуляются, после чего результат "умещается" в доступных битах. В случае с беззнаковыми типами - большие значения станут меньше, а при переполнении знаковых типов положительные числа станут отрицательными.
Позвольте мне продемонстрировать это поведение на примерах:
🔸 Максимальным значением для беззнакового типа
🔸
🔸 Минимальное значение для знакового типа
💬 Как я уже упоминал ранее, использовать минимальные и максимальные значения в циклах стоит с осторожностью, иначе это может привести к неожиданным последствиям. Примером тому служит следующий код. Что выведется на экране? Ответ вы сможете найти ниже на странице 😉
#data_types
Во время выполнения арифметических операций с целочисленными типами возможна ситуация, при которой итоговый результат выходит за рамки доступных значений результирующего типа (другими словами не может быть корректно представлен и размещён в памяти).
Такая ситуация называется переполнением (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