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