指针赋值 - uint16_t

And*_*rew -1 c pointers uint16

我正在查看来自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);                                          
}
Run Code Online (Sandbox Code Playgroud)

如果*reg为1,我的方法compute_bit_val返回1.打印输出为

1 

1

65536

65536

**0**
Run Code Online (Sandbox Code Playgroud)

?!?!?!我拉出我的头发,我不知道为什么最后一部分是零,由于某种原因,分配不起作用.我尝试使用和不使用铸造,它给出了相同的结果.

M.M*_*M.M 6

在最后一步,可以分配65536*reguint16_t.但是uint16_t只能存储值从065535,所以它被通过模运算调整为具有价值0.(又称.缠绕).

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

  • @Pseudonym移位运算符右侧的类型没有区别.左操作数经历整数提升(但不会尝试使用正确的操作数找到常见类型,例如`+`). (2认同)