首先请理解“反码”、“取反”、“按位取反(~)”这三个概念不同。
逆(取0变量1,1变量0 )对-1取逆,使-1为二进制形式的10000000000000000000000000000001,然后与编码比特一起取逆) 0变量1,1变量0 ),取http://www.Sina.com01111111111111111111111111111110则相反。
对-1取反二进制数:对100000000000000000000000000000000000000001取反二进制数: 0111111111111111110原著、反码和补码原著,第一位表示编码比特,第
/
-1的反码: 1111111111111111111111111111111111100的反码: 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
-1补码: 111111111111111111111111111111111111100000000000000001补码: 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
例如-1
-1的原码: 100000000000000000000000000000000000000001-1的反码: 11111111111111111111111
用VS2019验证一下吧。
int main () inta=-1; 返回0; 使用VS2019-F11-调试-窗口-内存-输入a
可以看到a的地址存储在01111111111111111111111111111110中。 这是十六进制数,转换后得到11111111111111111111111111111111。
倒排位那么倒排位是怎么工作的呢?
数字作为补数存储在存储器中,因此要以位为单位反转,首先将该数字的补数,包括符号位进行反转。
例如,相对于0按每个比特反转。
0的原码: 000000000000000000000000000000000的反码: 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
反过来取11111111111111111111111111111111,即为ff ff ff ff。
但是,请注意,此时编译器不会直接输出当前结果11111111111111111111111111111111。 因为那是补数的相反。
接下来进行逆运算,导出补码00000000000000000000000000000000的原始代码是什么。
补码: 11111111111111111111111111111111111111111111111111111100000000000001原码导出为http://www
写个程序验证一下吧
int main () inta=0; printf(%d(n )、~a ); 返回0; }运行结果
总结:要理解逐位取反码“~”的结构,首先要弄清楚原码、反码和补码的变换,然后理解逐位取反码是在存储器内反取数据的补码,反过来还原取的结果,恢复成原码