Если я не правильно понял, ваша проблема заключается в том, как преобразовать входные данные, которые на самом деле signed-byte
( сбайт ), но этот вход сохраняется в unsigned integer
, а затем также избегать отрицательного значения путем преобразования их в ноль.
Для ясности, когда вы используете подписанный тип (например, ubyte
), фреймворк использует Two's complement
за сценой, поэтому, просто приведя к нужному типу, вы будете использовать дополнение до двух.
Затем, как только вы закончите преобразование, вы можете зафиксировать отрицательные значения простым if
или условным троичным оператором (?: ).
Функции, представленные ниже, вернут 0
для значений from 128 to 255
(или от -128 до -1) и the same value
для значений from 0 to 127
.
Итак, если вы должны использовать целые числа без знака в качестве входных и выходных данных, вы можете использовать что-то вроде этого:
private static uint ConvertSByteToByte(uint input)
{
sbyte properDataType = (sbyte)input; //128..255 will be taken as -128..-1
if (properDataType < 0) { return 0; } //when negative just return 0
if (input > 255) { return 0; } //just in case as uint can be greater than 255
return input;
}
Или, ИМХО, вы можете изменить свои входные и выходные данные на типы данных, наиболее подходящие для ваших входных и выходных данных (sbyte и byte):
private static byte ConvertSByteToByte(sbyte input)
{
return input < 0 ? (byte)0 : (byte)input;
}