C语言之取反和取相反数

  • 取反(~)
    属于按位逻辑运算符,属于一元运算符,其本质其实就是将数据每一位按位取反,即将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、简单结果分析二
相反数直接关于环形对称。同样其他的数据类型也是同样的性质,只是数据范围变大了。简单粗暴!
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/yaoji1234/article/details/105996197