原码
十进制数字的二进制表现形式;第一位是正负,0为正,1为负;利用原码直接进行计算,正数计算无问题!而负数的计算利用原码计算会进行出错,解决这个错误的方法就是利用反码。(正数的原码、反码、补码都是相同的!)
反码
负数的反码就是符号位不变,数字位置取反:0变成1,1变成0。利用负数进行加减(符号位不参与),就可以得到正确的结果。但这在遇到负数计算到跨0的计算时,会出错。比如-5的反码(1111 1010),加6(0000 0110),会得到(0000 0000),本应得到1的结果却得到了0的结果(发现所有跨0的计算都比应得的结果小1,这是因为正反码概念中,0的表现有两种:+0和-0)!此时需要引入补码的概念!
补码
将-0的反码规定为-1的补码,-1的反码规定为-2的补码,依次类推。而0只有一种表现形式了。
而由于补码是由反码向下错开了一位,所以会多一个1000 0000的补码,人为规定其值为-128。这也是为何一个字节的取值范围为何是-128~+127!
计算机中数据的存储和计算都是以补码的形式进行的!
扩展:基本数据类型
规定8位是一个字节byte,所以其取值范围是-128~127!以此类推short、int、long的取值范围与占用的大小:
扩展:隐式转换、强制转换
byte、short、char等参与数值运算时,会隐式的转换成int类型,转换的形式就是在前补零!
强制转换就是强制的删除溢出部分!但需要注意!:正数的原码、反码和补码一致,但是负数的不一致,因此删除溢出后出现的可能就是负数!负数的话,实际上是补码形式!还要再转换回原码才能知晓结果!(见下下张图)
结果是-56(如果没有意识到存储是以补码的形式来进行的,那么容易得到-72这个结果!)
扩展:一些运算符!
属于扩展!自己用不到,但一些源码中可能会使用!
逻辑与&
逻辑或|
左移<<
向左移动,低位补0
规律:左移1次值会乘2
右移>>
高位补0,其中数值位补0,但首字母仍和原先值符号一致!
规律:右移1次值会除2!
无符号右移>>>
和右移一致,但是首字母符号位都补0!
标签:右移,反码,补码,负数,0000,原码 From: https://www.cnblogs.com/xiaoaozi/p/17017756.html