在c语言中,!和~均表示取反,这两个的区别在于:
- ! :代表逻辑取反,即:把非0的数值变为0,0变为1;
- ~ :表示按位取反,即在数值的二进制表示方式上,将0变为1,将1变为0;
- 上述其实可以从java中进行借鉴理解,java中!代表逻辑取反,针对的是boolean型值计算;而~代表数值取反,针对整型值进行计算;
通过如下例子来验证上述结论:
reverse_not.c
#include<stdio.h>
int main(){
int a,b,c;
a = !0;//逻辑运算,0数值转化为1
b = !10;//逻辑运算,非0数值转化为0
// 按位取反,10的16进制表示为0x00 00 00 0a,取反后为转化为0xff ff ff f5(这个是补码)
// 从补码往回计算出原码,得出真值,最高位为1表示为负值,负号后的值为:
// 0x1 00 00 00 00 - 0xff ff ff f5 = 11,得到-11
c = ~10;
printf("%d,%d,%d\n",a,b,c);//运算结果为1,0,-11
}
reverse_not.java
public class reverse_not{
public static void main(String[] args) {
// 这里代码报错,一元运算符,'!' 的操作数类型int错误,可见在java中,
// 规定了!运算符操作
// System.out.println(!10);
// 这里的运算结果和c语言中一致,也是-11,可见在java中也是使用补码,
// 并没有针对做真值取反的所谓优化
System.out.println(~10);
}
}