我正在查看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**
?!?!?!我正在拔头发,我不知道为什么最后一部分为零,由于某种原因,分配无法正常工作。我尝试了这种情况,无论有无强制转换,它都能得到相同的结果。
最佳答案
在最后一步中,将65536
分配给*reg
,即uint16_t
。但是,uint16_t
只能存储从0
到65535
的值,因此可以通过模块化算法将其调整为具有值0
。 (又名环绕)。
您可能会忽略整数算术始终以至少int
精度执行;在计算任何算术运算符的结果之前,较窄的类型将立即提升为int
。