0

我正在查看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**

?!?!?! 我正在拔头发,我不知道为什么最后一部分为零,由于某种原因,作业不起作用。我在有和没有强制转换的情况下都试过了,它给出了相同的结果。

4

1 回答 1

6

在最后一步中,您分配65536*regwhich is uint16_t。然而,uint16_t它只能存储来自0to 的值65535,因此它通过模算术进行调整以具有 value 0。(又名。环绕)。

您可能忽略了整数运算总是至少以int精度执行;int在计算任何算术运算符的结果之前,会立即提升更窄的类型。

于 2015-03-05T04:18:34.273 回答