gpt4 book ai didi

c - 为什么这个条件总是正确的? (pktNum != invPktNum)

转载 作者:太空狗 更新时间:2023-10-29 17:20:58 25 4
gpt4 key购买 nike

当我编译以下代码时,我的编译器会提示以下行始终为真。我想我可能对 != 运算符有错误的理解......

if (pktNum != ~invPktNum) {
return 1;
}

我正在尝试验证 invPktNum 确实是 pktNum 的倒数。如果没有,立即退出,否则照常进行。

我已经检查过,pktNum 是一个无符号字符,它是 0x01,invPktNum 是一个无符号字符,在比较时是 0xFE。

谁能教教我?提前致谢!

最佳答案

在 C 中,大多数表达式中类型比 int 窄的值在计算发生之前被提升为更宽的类型。如果 int 足够宽以容纳较窄类型的所有值,则将其提升为 int;否则它被提升为 unsigned int

在这种情况下,int 的宽度足以容纳您的 unsigned char 的所有值,因此您的值被提升为 int

pktNum(因此,提升的 pktNum)的值可以介于 0 和 255 之间(含 0 和 255)。这是将在 != 运算符左侧使用的值。

invPktNum 的值同样可以介于 0 和 255 之间(含 0 和 255)。该值将被提升为 int,然后按位求反。这种按位取反的结果将始终是一个负数,因为符号位将被取反。这是将在 != 运算符右侧使用的值。

没有负数可以等于提升的 pktNum,因此条件始终为真。

要执行您真正想要的计算,您需要在否定之后屏蔽掉低八位:

if (pktNum != (~invPktNum & 0xff)) {
return 1;
}

或者,您可以只否定您感兴趣的位:

if (pktNum != (invPktNum ^ 0xff)) {
return 1;
}

关于c - 为什么这个条件总是正确的? (pktNum != invPktNum),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4251335/

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