【发布时间】:2019-10-18 15:17:34
【问题描述】:
这两行代码是等价的吗?
P1->OUT &= ~(uint8_t)(1<<1);
P1->OUT &= (uint8_t)(~(1<<1));
【问题讨论】:
-
@EugeneSh。我没有看到任何会在6.5.3.3 Unary arithmetic operators, paragraph 4 中的签名
int值上使用产生警告的东西:“~ 运算符的结果是其(提升的)操作数的按位补码(即结果中的每一位)当且仅当未设置转换后的操作数中的相应位时才设置)。整数提升是在操作数上执行的,结果具有提升的类型。......“如果它是等价的,我不会深入研究,不过,按照标准。那是语言律师的东西。 -
@AndrewHenle 我最初的评论(由于我没有测试它而被删除)是关于在将签名转换为
uint8_t时有关“可能丢失数据”的警告,否则这是完全合法的 -
@EugeneSh。是的,gcc 对 IMO improper warnings 的内容有点过分热心了。所以它很可能会产生警告。
标签: c bit-manipulation language-lawyer bitwise-operators unsigned-integer