从 32 位数字中提取高位和低位 16 位字

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

我有以下代码,它“起作用”,因为我可以写入一个 32 位计数器值并将其放置在 dsPic 中 32 位寄存器的高字和低字中。我正在使用 MPLAB X IDE 和 XC16 编译器。

int main()
{
  unsigned long My_Number;      // 32 bit
  unsigned int High_Word;       // 16 bit 
  unsigned int Low_Word;        // 16 bit    
    
  My_Number = 0x6000C000;       // Decimal 1610661888

  High_Word = (My_Number & (0x1FFFF << 16)) >> (16);     // Returns 6000
 
  Low_Word = (My_Number & 0xFFFF ) ;                     // Returns C000  

  return 0;
}

我不明白的是为什么我需要使用 1FFFF 来屏蔽 High_Word。

我尝试了不同的值来查找返回的内容以找到解释,但有些东西没有点击,我不喜欢在不了解原因的情况下让任何东西起作用,因为这总是会导致问题。

c mask
1个回答
0
投票

我不明白的是为什么我需要使用 1FFFF 来屏蔽 High_Word,虽然左移 16 位会有

这没有意义,如果

sizeof(int) == 4
,它可能会调用未定义的行为。

我相信最初的程序员只是在输入函数时错误地点击了

1

int main()
{
    unsigned long My_Number;      
    unsigned int High_Word;        
    unsigned int Low_Word;            
    
    My_Number = 0x6000C000UL;     

    High_Word = My_Number>> (16);    
 
    Low_Word = My_Number & 0xFFFF;                    


    printf("%x %x\n", High_Word, Low_Word);

    return 0;
}

https://godbolt.org/z/Eh45KqEMe

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