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

Библиотека промежуточных процессов boost может быть тем, что вам нужно, - включающий файл Atomic.hpp содержит реализации сравнения и замены для различных платформ и компиляторов.

15
задан Michael Myers 2 June 2009 в 20:22
поделиться

9 ответов

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

15
ответ дан 1 December 2019 в 00:37
поделиться

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

byte - byte = (0..255) - (0..255) = -255..255
11
ответ дан 1 December 2019 в 00:37
поделиться

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

9
ответ дан 1 December 2019 в 00:37
поделиться

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

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

2
ответ дан 1 December 2019 в 00:37
поделиться

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

2
ответ дан 1 December 2019 в 00:37
поделиться

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

4
ответ дан 1 December 2019 в 00:37
поделиться

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

1
ответ дан 1 December 2019 в 00:37
поделиться

FWIW, java также преобразует байты в int.

0
ответ дан 1 December 2019 в 00:37
поделиться

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

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

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

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

1
ответ дан 1 December 2019 в 00:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: