Библиотека промежуточных процессов boost может быть тем, что вам нужно, - включающий файл Atomic.hpp содержит реализации сравнения и замены для различных платформ и компиляторов.
Поскольку вычитание приводит к целому числу. Насколько я помню, byte - это беззнаковый тип в C #, поэтому вычитание может вывести вас из области байтов.
Это потому, что результат вычитания байта не помещается в байте:
byte - byte = (0..255) - (0..255) = -255..255
Арифметика с байтами по умолчанию возвращает значение типа int.
Поскольку арифметические операции с sbyte, byte, ushort и short автоматически преобразуются в int. Наиболее вероятной причиной этого является то, что такие операции, вероятно, будут переполнены или опустошены.
Таким образом, в вашей тернарной операции окончательный oColor.R - процент фактически дает int, а не байт. Таким образом, тип возвращаемого значения операции - int.
Это связано с тем, что вычитание байта
возвращает int
. Фактически любые бинарные арифметические операции с байтами
вернут int
, поэтому требуется приведение.
Поскольку арифметика по байтам по умолчанию возвращает целые числа, из двух возможных назначений более узкий тип нуля (байт) повышается до int (тип oColor.r - процент). Таким образом, тип операции - int. Компилятор без приведения не позволит вам назначить более широкий тип более узкому типу, потому что это операция с потерями. Следовательно, вы получите ошибку, если вы явно не скажете «Я знаю, что теряю некоторые данные, все в порядке» с приведением.
Потому что арифметическое выражение в правой части оператора присваивания по умолчанию оценивается как int. В вашем примере процент
по умолчанию равен int
. Вы можете прочитать об этом на странице MSDN .
Попробуйте запустить этот код C #: объект o = (байт) (1); о = (int) o; Что вы ожидаете? А теперь попробуйте :)
Я думаю, что это правильно:
Эрик Липперт говорит: «Я не думаю о байтах как о« числах »; я думаю о них как о шаблонах битов, которые можно интерпретировать как числа или символы , или цвета, или что-то еще. Если вы собираетесь делать с ними математические вычисления и рассматривать их как числа, тогда имеет смысл переместить результат в тип данных, который обычно интерпретируется как число ».
Возможно, byte ближе к char, чем к int.