Подтвердить что ты не робот

Byte + byte = неизвестный результат

Добрый день! Я пытался добавить две байтовые переменные и заметил странный результат.

byte valueA = 255;
byte valueB = 1;
byte valueC = (byte)(valueA + valueB);

Console.WriteLine("{0} + {1} = {2}", valueA.ToString(), 
                                     valueB.ToString(), 
                                     valueC.ToString());

когда я пытался запустить программу, отображается

255 + 1 = 0

Что случилось с вышеуказанным кодом? Почему компилятор не выбрасывает OverflowException? Как я могу поймать исключение? Я парень VB и медленно мигрирую на С#:) Извините за вопрос.

4b9b3361

Ответ 1

Код С# по умолчанию равен unchecked, так что переполнение будет тихо обходить вокруг, а не бросать исключение.

Вы можете получить исключение, упаковали свой код в блок checked за счет небольшой производительности.

Ответ 2

потому что по умолчанию C# не проверяет переполнение арифметических операций. попробуйте обернуть его с помощью checked, чтобы он генерировал исключение.

попробуйте следующее:

byte valueA = 255;
byte valueB = 1;
byte valueC = (byte)(valueA + valueB);

Console.WriteLine("Without CHECKED: {0} + {1} = {2}", valueA.ToString(), 
                                                      valueB.ToString(), 
                                                      valueC.ToString());

try
{
    valueC = checked((byte)(valueA + valueB));
    Console.WriteLine("With CHECKED: {0} + {1} = {2}", valueA.ToString(), 
                                                       valueB.ToString(), 
                                                       valueC.ToString());
}
catch (Exception e)
{
    Console.WriteLine("With CHECKED: " + e.GetType());
}

checked @MSDN