Назначение указателя - 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
перед вычислением результата любого арифметического оператора.