我有这个代码,其中wAddress是指向uint16_t变量的指针。
uint8_t upperByte = *wAddress >> 8;
uint8_t lowerByte = *wAddress;
第一个移位操作是否会覆盖wAddress指向的变量中的值?
假设代码来自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
本身指向的值。