【发布时间】: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:是的。如果没有标准或公认的约定,它只应使用自定义约定。这就是我的评论所说的。如果您的应用程序使用这样的自制别名,那么它的设计就很糟糕。不是我看到的第一个,也很可能不是最后一个。但也许指出这一点可能会避免一个糟糕的编码程序。