取反(~)
是逐比特的逻辑运算符,是一元运算符,其本质是以比特为单位使数据的各位反转,即使0为1、1为0;
1、用简单代码测试一下: char val=2; char test=0; 无符号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; 无符号char unval1=2; 无符号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、简要结果分析1 :
因为是一元运算符,所以对它取相反数现在也不太清楚具体是怎么实现的。 我只说我的理解。 简单粗暴,可能是错误的,但大多数情况都适用
在负号之前加0,进行减法运算(0-数据补充) )
例如val=-2
原代码: 1000 0010
反码: 1111 1101
补数: 1111 1110
求相反数,-val=2
也就是说,00000000-11111110=00000010(2)
例如test=-128
补数: 1000 0000
求相反数-test=-128
即,0000 0000 – 1000 0000=1000 0000 (等于-128 ) )。
之后的数据转换与上述分析类似;
4、简要结果分析2
相反数直接关于环对称。 其他数据类型也具有相同的性质,但数据范围更广。 简单粗暴!