位运算符、十进制与十六进制技术咨询:为何指定代码执行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ţ
相关产品推荐
相关产品推荐

