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、简单结果分析二
相反数直接关于环形对称。同样其他的数据类型也是同样的性质,只是数据范围变大了。简单粗暴!
在这里插入图片描述

  • 12
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yaoji1234

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值