Есть вот такой очень простой код.
using System;
class Test
{
static void Main()
{
byte x = byte.Parse(Console.ReadLine());
byte y = byte.Parse(Console.ReadLine());
Console.WriteLine(x + y);
}
}
При вводе 123 и 221 выводит 344. Но ведь должно было произойти переполнение, почему оно не произошло? Почему не вывело 344 - 255 = 89?
Отличный вопрос!
Согласно спецификации языка, определены следующие операторы числового сложения:
int operator +(int x, int y);
uint operator +(uint x, uint y);
long operator +(long x, long y);
ulong operator +(ulong x, ulong y);
float operator +(float x, float y);
double operator +(double x, double y);
decimal operator +(decimal x, decimal y);
Сложение байтов не определено. Таким образом, язык применяет конверсию, и превращает byte
в int
, чтобы использовать int operator +(int x, int y);
.
Правила конверсии описаны здесь (перевод мой):
Расширение типов для бинарных операторов состоит в применении следующих правил в том порядке, в каком они специфицированы тут:
decimal
, другой операнд преобразуется в тип decimal
, или возникает ошибка времени привязки типов, если тип другого операнда — float
или double
.double
, другой операнд преобразуется в double
.float
, другой операнд преобразуется в float
.ulong
, другой операнд преобразуется в ulong
, или возникает ошибка времени привязки типов если другой операнд имеет тип sbyte
, short
, int
или long
.long
, другой операнд преобразуется в long
.uint
и тип другого операнда sbyte
, short
или int
, оба операнда преобразуются в long
.uint
, другой операнд преобразуется в uint
.int
.В нашем случае работает последний пункт. Значения преобразуются в int
до сложения, и тип результата — int
.
Дело в том, что результат сложения byte
+ byte
вовсе не обязан иметь тип byte
.
На самом деле, результат сложения имеет тип int
, в который можно запросто поместить число 334
.
А проверить это утверждение можно вот так:
using System;
class Test
{
static void Main()
{
byte x = 123;
byte y = 221;
byte z = x + y;
Console.WriteLine(z);
}
}
Приведет к ошибке:
Cannot implicitly convert type 'int' to 'byte'. An explicit conversion exists (are you missing a cast?)
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Как IOCP устроено в нативе - понятноСоздается IO порт, к нему привязываются сокеты
Создаю программу "Банкомат"Возник вопрос - как сделать чтобы пользователь ввел свой ид, и сразу показало его счет и фио класс банкомат
Здравствуйте, подскажите пожалуйста, как запретить повторное открытие страницы tabPage1, через buttonТ