Значения со знаком и без знака - это просто куча битов, это ВАША интерпретация, которая делает их знаковыми или неподписанными.Например, если ваше оборудование выдает 2 дополнения, если вы читаете 0xff, вы можете интерпретировать его как -1 или 255. Но на самом деле это одно и то же число.
Теперь, если в вашем распоряжении только unsigned char
вы должны имитировать поведение отрицательных значений с ним.
Например:
c < 0
меняется на
c > 127
К счастью, дополнение не нуждается в изменении,Также вычитание такое же (отметьте это, я не уверен на 100%).
Для умножения, например, вам нужно проверить это самостоятельно.Во-первых, в дополнении к 2, вот как вы получаете положительное значение числа:
pos_c = ~ neg_c + 1
, что с математической точки зрения 256-neg_c
, которое по модулю 256 просто -neg_c
Теперь предположим, что вы хотите умножить два числа без знака, но вы хотите интерпретировать их как подписанные.
unsigned char abs_a = a, abs_b = b;
char final_sign = 0; // 0 for positive, 1 for negative
if (a > 128)
{
abs_a = ~a+1
final_sign = 1-final_sign;
}
if (b > 128)
{
abs_b = ~b+1
final_sign = 1-final_sign;
}
result = abs_a*abs_b;
if (sign == 1)
result = ~result+1;
Вы поняли!