~ 是位取反操作,对同一比特模式,int 解释为补码得负数,unsigned int 解释为正数,故输出不同;例如 ~1 在 32 位下为 0xfffffffe,作 int 是 -2,作 unsigned int 是 4294967294。
为什么 ~ 对 unsigned int 和 int 的结果看起来不一样
因为 ~ 是纯位级操作,它不管符号,只翻转每一位;但你打印时,int 被解释为补码有符号数,而 unsigned int 直接当无符号整数读——同一串比特,解释方式不同,输出就差很远。
比如 int x = 1;,在 32 位系统上,x 的二进制是 00000000 00000000 00000000 00000001,~x 得到 11111111 11111111 11111111 11111110。若把它当 int 输出,就是 -2;若强制转成 unsigned int,就是 4294967294。
- 用
printf("%u", (unsigned int)~x)看无符号值 - 别直接对带符号整数做
~后再参与算术运算,容易溢出或逻辑错乱 - 如果目标是“取反后当掩码用”,优先声明为
unsigned类型
~ 在位掩码构造中常被误用的三种情况
写 ~(1 想清零第 n 位?没问题。但很多人没注意类型默认宽度和符号扩展问题。