我有这段代码,其中wAddress是指向uint16_t变量的指针。
uint8_t upperByte = *wAddress >> 8;
uint8_t lowerByte = *wAddress;
第一个移位操作是否会覆盖wAddress指向的变量中的值?
答案 0 :(得分:0)
假设代码来自C或C ++(这是一个值得指出的假设,因为不同的语言处理语法,运算符和操作顺序不同),那么不,第一个转换不会覆盖变量中的值。相反,移位会覆盖寄存器中的位。
当您的代码
时uint16_t someInt = 61590; // Binary: 1111 0000 1001 0110
uint16_t *wAddress = &someInt;
uint8_t upperByte = *wAddress >> 8;
uint8_t lowerByte = *wAddress;
当编译为ASM时,首先要加载wAddress
引用的值 61590 。一旦该值在寄存器中,它将向右移位8位,这意味着底部的8位将被前8位替换,前8位将被寄存器内的零填充。即,0000 0000 1111 0000
(十进制为240)。然后该值将被截断为新的底部8位并保存为upperByte
变量的值。
此后,someInt
的另一个副本将被加载到寄存器中,这次前8位将被丢弃,最后8位被置为lowerByte
的值,因为没有发生了转变。
要实际覆盖someInt
的值,您必须明确说出someInt = *wAddress >> 8;
,否则,只会修改存储在someInt
中的值的副本,而不是指向的值由wAddress
本身。