【发布时间】:2022-03-25 01:44:36
【问题描述】:
在使用 TM4C123GXL 时,我遇到了一个奇怪的行为,我认为这归因于编译器。 (TI v20.2.5.LTS) 将按位求反函数与等价运算符结合使用时,编译器似乎没有正确遵循操作顺序。
本质上,您会发现选项#1 将不起作用,即使它应该是正确的(据我所见)也会导致错误。但是,选项 #2 将起作用并将结果为真。 (据我所知,这与不必要的变量声明相同)
选项#1(应该有效,但无效)
uint8_t foo = 0x40; // 0100 0000
uint8_t fooinv = 0xBF; // 1011 1111
uint8_t bar = 0x04; // 0000 0100
uint8_t barinv = 0xFB; // 1101 1111
bool valid = true;
valid = (foo == ~fooinv) && valid;
valid = (bar == ~barinv) && valid;
选项#2(额外变量但有效)
uint8_t foo = 0x40; // 0100 0000
uint8_t fooinv = 0xBF; // 1011 1111
uint8_t bar = 0x04; // 0000 0100
uint8_t barinv = 0xFB; // 1101 1111
uint8_t temp1 = ~fooinv;
uint8_t temp2 = ~barinv;
bool valid = true;
valid = (foo == temp1) && valid;
valid = (bar == temp2) && valid;
我怀疑这是因为可能存在某种未解决的数据危害,但我无法确定这里发生了什么。我还没有反汇编编译器创建的代码,但感谢您提供任何帮助。
标签: c bit-manipulation bitwise-operators