C语言中,取反运算符~a=-(a+1)的原因
1、为什么计算机储存数据用的是补码?
为了减小开销。
2、为什么用补码能减小开销?
因为计算机直接拿读取到的数据去运算付出的代价是最小的,所以计算机存储的数据的形式应该满足读取后不必经过任何加工就能直接用来运算
3、为什么补码可以满足 不必经过任何加工就能直接用来运算 的要求
人们设计出来的,原理是溢出不储存进位。原码不经加工无法实现(+a)+(-a)=0,所以不满足该要求;为了满足(+a)+(-a)=0的要求,人们设计出了补码来满足该要求,因而计算机中存储数据的形式为原码的补码
正题:
知道以上3点就容易解释为什么~a=-(a+1)了
4、~取反运算符的作用原理是什么?
4.1、为什么符号位相反?
首先,~的作用是将计算机存储的二进制数所有位取反(注意是存储的二进制数,而不是输出的二进制数)
这是就可以得出结论1:由于所有位都取反时符号位取反了,所以a与~a符号位一定相反
4.2、为什么~a的绝对值比a大1?
其次,计算机存储的二进制数是原码的补码,输出前要做一次补码到原码的转化过程(注意正数:3码合一;负数:要先数值位减一,再符号位不变,数值位取反 或者先数值位不变,数值位取反,再数值位加一)
这是便可得出结论2:由于所有位都取反时数值位取反一次,补码转化成原码输出时又取反一次,所以抵消了,这样数值位的不变;在此基础上数值位再加一,输出~a的绝对值就比原来的输入a的绝对值大一了。
鸣谢:
感谢这位大佬的详解:取反运算符~详解 - 知乎 (zhihu.com) 及其他未提及的贡献者!