Почему приведение требуется для вычитания байтов в C#?

Я должен следующий код в VS2008 .net 3.5 с помощью WinForms:

byte percent = 70;
byte zero = 0;

Bitmap copy = (Bitmap)image1.Clone();
...

Color oColor = copy.GetPixel(x, y);
byte oR = (byte)(oColor.R - percent < zero ? zero : oColor.R - percent);

Когда я уйду (byte) "из последней строки кода я получаю сообщение об ошибке компилятора" Не могу неявно преобразовать тип " int к byte '. "Если все имеет тип byte а также byte это целочисленный тип... тогда почему мне нужно иметь приведение?

9 ответов

Решение

Потому что вычитание приводит к целому числу. Насколько я помню, в C# байт является беззнаковым типом, поэтому вычитание может вывести вас из области байтов.

Это потому, что результат вычитания байта не помещается в байте:

byte - byte = (0..255) - (0..255) = -255..255

Арифметика в байтах приводит к значению int по умолчанию.

Поскольку арифметика в байтах по умолчанию возвращает целые числа, поэтому из двух возможных присваиваний более узкий тип нуля (байт) повышается до типа int (тип oColor.r - процентов). Таким образом, тип операции - int. Компилятор не позволит без преобразования привести более широкий тип к более узкому типу, потому что это операция с потерями. Следовательно, вы получите ошибку, если только вы явно не скажете "Я знаю, что я теряю некоторые данные, все в порядке" с актерами.

Это потому что byte вычитание возвращает int, На самом деле любые двоичные арифметические операции на bytes вернет intтак что актерский состав обязателен.

Потому что арифметические операции над sbyte, byte, ushort и short автоматически преобразуются в int. Наиболее вероятная причина этого заключается в том, что такие операции могут быть переполнены или недостаточны.

Таким образом, в вашей троичной операции конечный oColor.R - процент фактически приводит к целому числу, а не байту. Таким образом, возвращаемый тип операции - int.

Попробуйте запустить этот код C#: object o = (byte)(1); o = (int)o; Что вы ожидаете? Теперь попробуй:)

Я думаю, что это правильно

Эрик Липперт говорит: "Я не думаю о байтах как о" числах "; я думаю о них как о шаблонах битов, которые можно интерпретировать как числа, или символы, или цвета, или что-то еще. Если вы собираетесь заниматься математикой на их и рассматривая их как числа, тогда имеет смысл перенести результат в тип данных, который чаще интерпретируется как число ".

Возможно, байт ближе к char, чем к int.

Потому что арифметическое выражение в правой части оператора присваивания по умолчанию оценивается как int. В вашем примере percent по умолчанию int, Вы можете прочитать больше об этом на странице MSDN.

FWIW, Java также продвигает байты в int.

Другие вопросы по тегам