You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

位运算符、十进制与十六进制技术咨询:为何指定代码执行IF分支?

解惑:为什么if ((~7 & 0x000f) == 8)会执行打印语句?

嘿,这个问题问得好!让我们一步步拆解清楚背后的位运算逻辑:

  • 第一步:明确int类型的二进制表示
    在绝大多数现代系统中,C语言的int是32位的有符号整数。数字7的32位二进制是:

    00000000 00000000 00000000 00000111
    
  • 第二步:理解按位取反~操作
    按位取反会对每一位的0和1互换。所以~7的32位二进制是:

    11111111 11111111 11111111 11111000
    

    你之前误以为是8位的11111001,这是把它当成了8位整数,但实际上int的位数远多于8位,而且这里取反后的低四位是1000,不是1001哦。

  • 第三步:执行按位与&操作
    0x000f的二进制是00000000 00000000 00000000 00001111,它的作用是保留另一个数的低四位。当~7和0x000f做按位与时,只有对应位都为1时结果才是1,最终得到的二进制是:

    00000000 00000000 00000000 00001000
    

    这个值对应的十进制就是8,所以(~7 & 0x000f) == 8的结果为真,自然会执行printf分支里的代码。

额外补充:即使把7当成8位的char类型,~7作为有符号char会是-8(补码表示),但在和0x000f运算时会被自动提升为int类型,最终低四位的运算结果依然是8,条件依然成立。

内容的提问来源于stack exchange,提问作者Marco Mărculeţ

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:49:02