这种操作究竟做了什么?

问题描述 投票:0回答:1

我有这个代码,其中wAddress是指向uint16_t变量的指针。

uint8_t upperByte = *wAddress >> 8; 
uint8_t lowerByte = *wAddress;

第一个移位操作是否会覆盖wAddress指向的变量中的值?

pointers bit-shift
1个回答
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本身指向的值。

© www.soinside.com 2019 - 2024. All rights reserved.