【问题标题】:why do bit operations not work correctly为什么位操作不能正常工作
【发布时间】:2017-06-30 01:40:23
【问题描述】:

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

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

【问题讨论】:

  • 你从未初始化过alarmed_lans,所以你的程序会导致未定义的行为
  • 如果有标准类型,不要使用自制类型。使用uint64_t
  • 你修复了alarmed_lans 没有被初始化,但现在它变得更没有意义了。 alarmed_lans 在哪里设置为 3003000000000000
  • @cerr:与使用标准别名相比,它有哪些额外的好处?请注意,在 C 中无法定义新类型(我的评论有点不精确)。另一方面是全大写通常仅用于宏和 enum-constants。这是少数被广泛接受的命名约定之一。专注于编写可读的代码。
  • @cerr:是的。如果没有标准或公认的约定,它只应使用自定义约定。这就是我的评论所说的。如果您的应用程序使用这样的自制别名,那么它的设计就很糟糕。不是我看到的第一个,也很可能不是最后一个。但也许指出这一点可能会避免一个糟糕的编码程序。

标签: c bitmask vxworks powerpc


【解决方案1】:
alarmed_lans &= ((tmpA<<32) |tmpB);
  • alarmed_lans 从未初始化。使用它会导致未定义的行为。
    • tmpB 为 0xfffff…(全为 1)
    • 或者任何东西,你都会再次得到全 1。
    • 加上x,你会得到x

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

【讨论】:

  • @cerr 那么alarmed_lans 的值在哪里设置?
【解决方案2】:
alarmed_lans &= ((tmpA << 32) | tmpB);
                              ^            // change this | to &
alarmed_lans &= ((tmpA << 32) & tmpB);

【讨论】:

    猜你喜欢
    • 2016-07-16
    • 2019-01-04
    • 2020-09-03
    • 2016-10-10
    • 2016-10-24
    • 2017-02-27
    • 2017-07-08
    • 2014-11-23
    • 2021-03-07
    相关资源
    最近更新 更多