为什么位运算不能正常工作

why do bit operations not work correctly

我完全不知所措!为什么我的代码没有按预期工作? 我有以下代码:

UINT64 tmpA = 0;
UINT64 tmpB = 0; 
UINT64 alarmed_lans = 0;
int foprtmsk[2]={0};
switch_fo_prtmsk_getptr(foprtmsk); 
tmpA = foprtmsk[1];                            
tmpB = foprtmsk[0];                            
gDbgLog("tmpA <%016llx>",tmpA);                
gDbgLog("tmpB <%016llx>",tmpB);                
gDbgLog("alarmed_lans <%016llx>",alarmed_lans);
alarmed_lans &= ((tmpA<<32) |tmpB);            
gDbgLog("alarmed_lans <%016llx>",alarmed_lans);

生成的日志如下所示:

|0x1f604|7857[us]|fpga-alarm|fpga_faultlocalizer|tmpA <ffffffffeffeffff>
|0x1f6cb|7861[us]|fpga-alarm|fpga_faultlocalizer|tmpB <ffffffffffffffff>
|0x1f741|7863[us]|fpga-alarm|fpga_faultlocalizer|alarmed_lans <3003000000000000>
|0x1f7b8|7865[us]|fpga-alarm|fpga_faultlocalizer|alarmed_lans <3003000000000000>

现在,我想知道为什么位掩码应用不正确??? 我希望看到

|0x1f7b8|7865[us]|fpga-alarm|fpga_faultlocalizer|alarmed_lans <2002000000000000>

这是怎么回事?

CPU:PPC85XXe500
编译器:diab
OS: VxWorks

alarmed_lans &= ((tmpA<<32) |tmpB);
  • alarmed_lans 从未被初始化。使用它会导致未定义的行为。
    • tmpB 为 0xfffff…(全为 1)
    • 或者用任何东西,你又得到全 1。
    • 加上 x 你会得到 x

理论上,你应该得到alarmed_lans的未初始化值,但实际上,编译器可以做任何事情,包括调用nasal demons

alarmed_lans &= ((tmpA << 32) | tmpB);
                              ^            // change this | to &
alarmed_lans &= ((tmpA << 32) & tmpB);