为什么位操作无法正常工作

时间:2017-06-30 01:40:24

标签: c bitmask vxworks powerpc

我完全失败了!为什么我的代码不能按预期工作? 我有以下代码:

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
操作系统:VxWorks

2 个答案:

答案 0 :(得分:1)

alarmed_lans &= ((tmpA<<32) |tmpB);
  • alarmed_lans从未初始化。使用它会导致未定义的行为。
    • tmpB是0xfffff ...(全1)
    • 或任何东西,你再次获得所有1。
    • x相关,您获得x

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

答案 1 :(得分:1)

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