按位运算符。十进制和Hexa

时间:2018-04-18 18:56:45

标签: c

晚上好。

有人可以解释一下为什么以下代码从IF条件运行消息吗?

if ((~7 & 0x000f) == 8)
   printf("Honesty is the best policy\n");

据我所知~7 = 11111001和0x000f = 00001111

谢谢!

3 个答案:

答案 0 :(得分:3)

-7(确实是11111001)
不是〜7(11111000)

你离开了1。

11111000
&
00001111
==
00001000

是真的。

(这个答案遵循明显的问题,使用简化的8位模型来处理所涉及的值。)

答案 1 :(得分:1)

  

据我所知~7 = 11111001和0x000f = 00001111

从两个角度看,这是不正确的。

  1. 7属于int类型。如果您所在的平台sizeof(int)为4,则二进制的7将为00000000 00000000 00000000 0000111。因此,~7将为1111111 11111111 11111111 1111000

  2. 即使忽略前3个字节,最后一个字节的位也不同。

答案 2 :(得分:1)

这里7 = 00000111 1的7的补码是11111000十六进制代码0X0000f = 00001111逐位,并且11111000&00001111 = 00001000的运算是8,即非零值,因此如果执行循环,它将打印“诚实是最好的策略“。