Назначение указателя - uint16_t

Я смотрел на проблему от cs61c (ucb). У меня есть следующий метод:

void lfsr_calculate(uint16_t *reg) {                                      
  uint16_t result = compute_bit_val(*reg);                              
  printf("reg value: %d", *reg);                                        
  printf("bit val result: %d", result);                                 
  printf("bit val result shifted: %d", result << 16);                   
  *reg >>= 1;                                                           
  printf("bit val result shifted plus zero: %d", *reg + (result << 16));
  *reg = (uint16_t) *reg + (result << 16);                              
  printf("new reg: %d", *reg);                                          
}

Если *reg = 1, мой метод compute_bit_val возвращает 1. Вывод на печать

1 

1

65536

65536

**0**

?!?!?! Я вытаскиваю свои волосы, я не знаю, почему последняя часть равна нулю, по какой-то причине задание не работает. Я попробовал это с и без кастинга, и это дает тот же результат.

1 ответ

Решение

На последнем шаге вы назначаете 65536 в *reg который uint16_t, тем не мение uint16_t можно хранить только значения из 0 в 65535так что он корректируется с помощью модульной арифметики, чтобы иметь значение 0, (ака. оборачивается).

Вы можете не заметить, что целочисленная арифметика всегда выполняется по крайней мере int точность; более узкие типы немедленно повышаются до int перед вычислением результата любого арифметического оператора.

Другие вопросы по тегам