为什么 !0 等于 1 而不是 -1?

Why is !0 equal to 1 and not -1?

以下代码

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

原因是在标准 C 中,指定所有运算符 returning 布尔值 return 为 1 或 0。!0 计算 0 的逻辑非,即 1。 1 的逻辑非则为 0。

您要使用的是按位非运算符,即 ~0 应该是 0xFFFFFFFF == -1.