我正在查看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只能存储从065535的值,因此可以通过模块化算法将其调整为具有值0。 (又名环绕)。

您可能会忽略整数算术始终以至少int精度执行;在计算任何算术运算符的结果之前,较窄的类型将立即提升为int

07-24 09:44
查看更多