- 取反(~)
属于按位逻辑运算符,属于一元运算符,其本质其实就是将数据每一位按位取反,即将0变成1,将1变成0;
1、 简单代码做一下测试:
char val = 2;
char test = 0;
unsigned char unval = 0;
test = ~val;
unval = ~val;
printf("val5 = %d\n", test);
printf("val5 = %d\n", unval);
2、结果如下:
3、简要分析:
变量val的值为2,其在计算机内部是以补码的形式存在的
原码:0000 0010
反码:0000 0010
补码:0000 0010
~val取反后,(是对补码进行取反)
补码:1111 1101
反码:1111 1100
原码:1000 0011 = -3
所以将char val取反后赋值给char test,其值为-3;
但将其取反后赋值给unsigned char unval,涉及到同类型的有符号向无符号转换,值为-3 + 28 = 253;
- 取相反数 (-)
此时的“-”是作为符号运算符,属于一元运算符,
1、简单代码测试:
// An highlighted block
char val = -2;
char test = -128;
unsigned char unval1 = 2;
unsigned char unval2 = 128;
val = -val;
test = -test;
unval1 = -unval1;
unval2 = -unval2;
printf("-val = %d\n", val);
printf("-test = %d\n", test);
printf("-unval1 = %d\n", unval1);
printf("-unval1 = %d\n", unval2);
2、结果如下:
3、简单结果分析一:
因为是一元运算符,对其取相反数现在也不太明白具体是如何实现的,只说说我的理解,简单粗暴,可能不对,但对大多数情况都适用
在负号前面加0,进行减法运算(0-数据补码)
如val = -2
原码:1000 0010
反码:1111 1101
补码:1111 1110
求相反数,-val = 2
即0000 0000 - 1111 1110 = 0000 0010 (等于2)
如test =-128
补码:1000 0000
求相反数 -test = -128
即0000 0000 - 1000 0000 = 1000 0000 (等于-128)
后面的数据转换与上述分析类似;
4、简单结果分析二
相反数直接关于环形对称。同样其他的数据类型也是同样的性质,只是数据范围变大了。简单粗暴!