This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] MSP430FR2355:有关移位运算符的基本问题???

Guru**** 2531950 points
Other Parts Discussed in Thread: MSP430FR2355

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1043342/msp430fr2355-basic-question-on-shift-operator

器件型号:MSP430FR2355

在将上述内容与 CCS 结合使用时、我注意到移位运算符存在一些奇怪的情况。  我期望如果我向左或向右移动,“0”将被移入,但我看到,如果我向右移动,“1”将移入,如果向左移动,“0”将移入…… 这是班次的工作方式吗?

示例 uint8_t 变量  

0xE1 >> 4.

0xFFFE

我本来希望0X0E......

我发现我必须进行拼写和执行类似的操作

(uint8_t (变量>> 4)& 0xF))

这是正确的还是缺少什么?

谢谢

我在这里添加了一个跟踪...我首先将变量反转为~变量 似乎对 uint8_t 执行按位否定会创建一个有符号整型...有人能告诉我为什么不创建有符号 uint8_t?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我认为  这是由隐式类型促销规则的整数促销部分解释的。 引用的 StackOverflow 文章对其进行了比我能做得更好的解释。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我看不到您描述的行为。 如果 I 代码:

    >易失性 uint16_t RRR =(0xE1 >> 4);

    编译器(.lst)在 RRR 中为我提供0x000E。

    ----

    若要回答您的问题:0xE1是 int (大约"(int16_t) 0xE1")。 如果希望它是无符号的、则在常量中附加一个"u"、例如0xE1u。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    //                    if (((~relayRegister) >> 4) & 0xF)
                        if ((uint8_t)(~relayRegister >> 4) & (relayRegister & 0x0F))
    

    我相信你是正确的……以上两行代码完全不同……评论中的一行不起作用,未评论的行有效……两个完全不同的操作,虽然它们看起来应该产生相同的结果…

    呃……请注意自己  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="47378" URL"~/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1043342/msp430fr2355-basic-question-on-shift-operator/3858856 #3858856"]编译器(.lst)在 RRR 中为我提供0x000E。

    我刚刚尝试在 MSP430FR2355中运行以下代码:

    #include <msp430.h> 
    #include <stdint.h>
    
    /**
     * main.c
     */
    int main(void)
    {
    	WDTCTL = WDTPW | WDTHOLD;	// stop watchdog timer
    	
    	volatile uint8_t variable = 0xE1;
    	volatile uint16_t rrr_a = variable >> 4;
        volatile uint16_t rrr_b = variable >> 4u;
    	volatile uint16_t rrr_c = 0xE1 >> 4;
    
    	return 0;
    }
    

    其中生成的汇编器为:

     8      {
            main():
    00803c:   8231                SUB.W   #8,SP
     9      	WDTCTL = WDTPW | WDTHOLD;	// stop watchdog timer
    00803e:   40B2 5A80 01CC      MOV.W   #0x5a80,&WDT_A_WDTCTL
    11      	volatile uint8_t variable = 0xE1;
    008044:   40F1 00E1 0006      MOV.B   #0x00e1,0x0006(SP)
    12      	volatile uint16_t rrr_a = variable >> 4;
    00804a:   415F 0006           MOV.B   0x0006(SP),R15
    00804e:   0F5F                RRUM.W  #4,R15
    008050:   4F81 0000           MOV.W   R15,0x0000(SP)
    13          volatile uint16_t rrr_b = variable >> 4u;
    008054:   415F 0006           MOV.B   0x0006(SP),R15
    008058:   0F5F                RRUM.W  #4,R15
    00805a:   4F81 0002           MOV.W   R15,0x0002(SP)
    14      	volatile uint16_t rrr_c = 0xE1 >> 4;
    00805e:   40B1 000E 0004      MOV.W   #0x000e,0x0004(SP)
    16      	return 0;
    008064:   430C                CLR.W   R12
    17      }

    RRA_A、RRA_b 和 RRA_c 均为14。

    对于 RRA_A 和 RRA_b、编译器发出 了 RRUM.W 指令、对于 RRC_c、编译器发出了一个常量。

    这是使用优化级别为零的 TI v21.6.0.LTS 编译器。