指针赋值 - uint16_t
Pointer assignment - 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 returns 1.打印输出为
1
1
65536
65536
**0**
?!?!?!我正在拔头发,我不知道为什么最后一部分是零,由于某种原因,分配不起作用。我在有和没有投射的情况下都试过了,结果都是一样的。
在最后一步中,您将 65536
分配给 *reg
,即 uint16_t
。然而 uint16_t
只能存储从 0
到 65535
的值,因此它通过模运算调整为值 0
。 (又名。环绕)。
您可能忽略了整数运算总是以至少 int
的精度执行;在计算任何算术运算符的结果之前,较窄的类型会立即提升为 int
。
我在看 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 returns 1.打印输出为
1
1
65536
65536
**0**
?!?!?!我正在拔头发,我不知道为什么最后一部分是零,由于某种原因,分配不起作用。我在有和没有投射的情况下都试过了,结果都是一样的。
在最后一步中,您将 65536
分配给 *reg
,即 uint16_t
。然而 uint16_t
只能存储从 0
到 65535
的值,因此它通过模运算调整为值 0
。 (又名。环绕)。
您可能忽略了整数运算总是以至少 int
的精度执行;在计算任何算术运算符的结果之前,较窄的类型会立即提升为 int
。