一、原码
1、原码的表现形式
十进制数的二进制表现形式,最左边的称为符号位,0表示正,1表示负
2、一个字节的原码的最大值&最小值
一个0或一个1表示一个比特位,一个字节是八个比特位 其中首位表示符号位,因此一个字节能表示的最大数是127 但是最小值却不是-127 而是-128 ,这是因为补码的原因
因为补码需要在反码的基础上+1来消除两个0的影响,所以产生了10000000,科学家将它规定为-128(详见二、三)
3、原码的弊端
原码的弊端体现在原码的负数计算上(正数的计算是正确的),以下图为例:
负数的原码计算相当于该负数与数字进行运算后再取符号,因为负数的原码最左边的符号位为1,与数字进行运算之后这个符号位很有可能不会发生改变
二、反码
为了解决原码不能进行负数计算而产生的
1、反码的表现形式
step1、首先将数字转化为原码
step2、如果该数字为正,则不用进行下一步处理,如果该数字为负,则需要在原码的基础上符号位不变,其余位0变1,1变0
2、反码的负数计算
以-56+1为例:
因为负数的反码不好转化为原码,因此我们反其道而行,求出-55的反码,最后将-55的反码与我们上一步按-56的反码加1求出的反码进行比较,看是否相同
我们发现-55的反码与我们上一步按-56的反码加1求出的反码是一样的,因此用反码进行负数运算时正确的
3、反码负数计算的弊端
当负数加一个值仍是负数时,用反码进行计算没有问题,但是,当负数加一个值是正数时,用反码计算就会出现问题
以-4为例:
***原因是0的反码有两个,因此当负数加一个数变成正数利用反码进行计算的结果会比十进制计算的结果小1,因为反码计算经过了两个0
三、补码
为了解决反码跨零后值比正确值少一的情况而产生了补码
1、补码的表现形式
正数的原码、反码、补码是一样的!!!
step1、首先将数字转化为原码
step2、如果该数字为正,则不用进行下一步处理(即得到了反码的形式,其实也就得到了补码的形式),如果该数字为负,则需要在原码的基础上符号位不变,其余位0变1,1变0,得到对应的反码
step3、最后在反码的基础上加1得到补码
2、补码的负数计算
以-4为例:
在计算机中,数字的存储与计算都是通过补码进行的
四、小技巧:在计算器中求补码
1、点击计算器
2、点击"三"这个图标
3、点击程序员
4、点击位切换键盘
5、点击DWORD该处的图标选择你需要的字节大小
左图表示8个字节 右图表示4个字节
6、选择好你需要的字节大小后 点击0可以切换为1 来输入你想要得到对应反码的数字 (这里以byte为例)
五、不同数据类型下数字的表现形式
六、数据类型转化的底层原理
1、隐式转化
隐式转化是将比特位小的数转化为比特位大的数,因此我们直接补0即可
2、强制类型转化
七、逻辑运算符在计算机的底层逻辑
1、逻辑与&
step1:先求出参与逻辑与运算的2个十进制数对应的补码
step2:将2个补码进行逻辑与运算 2个全为1则结果为1 其余结果为0
step3:最后将进行逻辑与运算的结果(补码的形式)转化为十进制形式
2、逻辑或|
step1:先求出参与逻辑或运算的2个十进制数对应的补码
step2:将2个补码进行逻辑或运算 有1则结果为1 全为0结果为0
step3:最后将进行逻辑或运算的结果(补码的形式)转化为十进制形式
3、左移<<
左移就是将二进制补码向左移位,然后将空缺的低位进行补0
以下图代码为例:
1、将参与左移运算的数字转化为对应的二进制补码形式
2、将二进制补码向左移2次
3、将空缺的低位进行补0
公式:左移一次相当于在原数字的基础上x2
4、右移>>
右移就是将二进制补码向右移位,然后将数值位补0,符号位根据原数字的正负确定,如果原数字为正,则符号位补0,如果原数字为负,则符号位补1
以下图代码为例:
1、将参与右移运算的数字转化为对应的二进制补码形式
2、将二进制补码向右移2次
3、数值位补0,符号位根据原数字的正负确定,如果原数字为正,则符号位补0,如果原数字为负,则符号位补1
这里200为正 所以符号位补0
最终结果:该00000000000000000000000000110010反码对应的十进制数为50
公式:右移一次相当于在原数字的基础上÷2
5、无符号右移>>>
与右移类似,只不过在空位补0时,不需要区分符号位和数值位,通通补0