我完全失败了!为什么我的代码不能按预期工作? 我有以下代码:
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
答案 0 :(得分:1)
alarmed_lans &= ((tmpA<<32) |tmpB);
alarmed_lans
从未初始化。使用它会导致未定义的行为。
x
相关,您获得x
理论上,你应该得到alarmed_lans
的未初始化值,但实际上,允许编译器做任何事情,包括调用nasal demons
答案 1 :(得分:1)
alarmed_lans &= ((tmpA << 32) | tmpB);
^ // change this | to &
alarmed_lans &= ((tmpA << 32) & tmpB);