Добавление двух символов в короткий результат приводит к неправильному ответу - PullRequest
0 голосов
/ 31 марта 2019

У меня есть функция, которая нацелена на получение значения двух символов, складываемых вместе в короткий. Кажется, что значение обрезается или искажается.

Вот мой код:

char rotate(char a, char b){
    unsigned short x = a + b;
    printf("init:%hu %hu = %hu\n", (unsigned char)a, (unsigned char)b,  (unsigned short)x);
    if(x > 255){
       x -= 255;
    }
    return (char) x;
}

unsigned char x = rotate((unsigned char)230, (unsigned char)100);
unsigned char y = rotate((unsigned char )200, (unsigned char)200);
unsigned char z = rotate((unsigned char) 230, (unsigned char)120);

и результаты

init:230 100 = 74
init:200 200 = 65424
init:230 120 = 94

1 Ответ

1 голос
/ 31 марта 2019

Добавление выполняется с исходными значениями и является правильным.

unsigned short x = a + b;

Тем не менее, отображение выполняется с преобразованными значениями.

printf("init:%hu %hu = %hu\n", (unsigned char)a, (unsigned char)b, ....

Распечатайте char исходные значения.

#if CHAR_MAX <= INT_MAX
  printf("a:%d b:%d\n", a, b);
#else
  // this is rare
  printf("a:%u b:%u\n", a, b);
#endif

OP увидит, что первое добавление - init:-26 100 = 74, а сумма 74 соответствует ожидаемой.


При init:200 200 = 65424 исходные значения char равны -56. -56 + -56 это -112. Присвоение -112 16-битному unsigned short (0-65535) добавляет 65536, а затем присваивает. -112 + 65536 -> 65424.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...