gpt4 book ai didi

c - 这个按位运算符的位置是否会改变行为?

转载 作者:行者123 更新时间:2023-12-05 00:10:24 24 4
gpt4 key购买 nike

这两行代码等价吗?

P1->OUT &= ~(uint8_t)(1<<1);

P1->OUT &= (uint8_t)(~(1<<1));

最佳答案

这取决于 P1->OUT 的类型,和系统。 1 << 1的结果类型为 int .

我正在考虑 int n; 的一般情况而不是 1 << 1

P1->OUT &= ~(uint8_t)(n);

操作数将扩大到 int再次之前 ~ (整数提升)和 ~将应用于 int .结果将设置所有高位 8...k。如 P1->OUT是 8 位宽它是可以的,但是如果它有更多位那么结果不是你所期望的。

这个更糟糕:
P1->OUT &= (uint8_t)(~(n));
~操作数将再次应用于 int这将被转换为 uint8_t .现在如果 ~n实际上是负的(设置了符号位) - 在 ~(1 << 1) 的情况下它会是负数 - 在二进制补码实现中会很好,但是 在 1's-complement 和 sign-and-magnitude 实现中不正确,因为位表示不会相同。

进行位处理的正确方法始终是使用 unsigned int 或更宽的二进制补码数:
P1->OUT &= ~(1U << n);

或者
P1->OUT &= (~(1U << n)) & 0xFF;

以避免产生有符号数的算术转换和整数提升。

关于c - 这个按位运算符的位置是否会改变行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58453740/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com