最近在复习C语言的基础,本科学的太水了,而且后期主要用Java写实验,C和C++好多精彩的东西都忘记了,突然看到原码,补码,反码的运算,看了看又没避免自己眼高手低的毛病,好多看着会,一看就不会了。
有一些很必要的知识点我看了尚硅谷韩老师的课件中这样写:
- 电子计算机技术全部采用二进制,也就是由0、1构成
- 在计算机中,二进制的最高位是符号位,0表示正数,1表示负数。
- 正数的原码,反码,补码都是一样的。
- 负数的反码 = 原码符号位不变,其它位按位取反,即0→1,1→0
- 负数的补码 = 反码 + 1
- 0分为+0和-0,8位计算机中,
- +0的原码是00000000 -0的原码是10000000
- +0的反码是00000000 -0的反码是11111111
- +0和-0的补码均为00000000
- 在计算机的运算中,都是按照补码来运算的。
- 对于移位运算
- 算术左移 <<:符号位不变,低位补0
- 算术右移 >>:低位溢出,符号位不变,并且用符号位补充高位
下面以8位举几个例子
1>>2 → 0
1的原码、反码、补码:00000001,右移2位,低位2位01溢出,补充符号位0,最后结果为补码00000000,原码为00000000,10进制即为0
-1>>2 → -1
-1的原码:10000001,反码:11111110,补码:11111111,右移2位,低位2位11溢出,补充符号位1,最后结果为补码11111111,反码为11111110,原码为10000001,10进制即为-1
-1<<2 → -4
-1的原码:10000001,反码:11111110,补码:11111111,左移2位,符号位不变,低位补0,结果补码为:11111100,反码为:11111011,原码为:10000100,10进制即为-4
至于其他的运算法过程大概都是这样,如果不够熟练,可以在纸上写一写,总比糊弄过去强。暂时在书中看到的就这些,整理下来,以后在遇到其他的会再记录。