以下代码
printf("!%d = %d\n", 0, !0);
printf("!%d = %d\n", 1, !1);
printf("!%d = %d\n", -1, !-1);
给出
!0 = 1
!1 = 0
!-1 = 0
现在,考虑到0 = 0x00000000
,不应该!0 = 0xFFFFFFFF = -1
(对于签名代表)?
这会在位域中使用int
/ long
混乱,并立即反转所有内容。
这背后的原因是什么?是否只是为了避免!1
被视为布尔true
?
答案 0 :(得分:16)
原因是在标准C中,已经指定所有返回布尔值的运算符返回1或0.!0计算逻辑不为0,即1.逻辑不为1将为0。 / p>
您要使用的是按位NOT运算符,即~0
应为0xFFFFFFFF == -1
。