这种操作究竟做了什么?

时间:2017-11-06 07:30:37

标签: pointers bit-shift

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

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

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

1 个答案:

答案 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本身。