计算机中的二进制以补码的形式存在
1、名词解释
- 位置制计数法: 是指按位置决定数值的方式来计数的方法。
一个数的大小,用一组有顺序的数字表示。
数字表示的大小,取决于它所代表的数值和所处的位置 - 数码:使用的数字符号。(十进制的数码:0,1,2,3,4,5,6,7,8,9)
基数:每个进制的基数。(十进制的基数:10,逢10进一)
位权:固定位置对应的单位值。(十进制的位权:个、十、百、千…即10的0次方,1次方,2次方。。。) - 比特:最小的存储单位,单位是小写的b。
字节(byte):包含8个比特。 - 机器数:将数据的首位设定为符号位,0位正,1为负。
补码计算方式:整数补码=反码=原码,负数补码=反码+1。
2、进制转换
2.1、整数部分
- 二进制转换为十进制:展开位权进行求和运算
- 十进制转换为二进制: 除2取余直至运算结果为0,将余数倒序排序(最后面的为2的n次方)
- 二进制转八进制和十六进制:每3位的二进制数,可以转换成1位八进制数,每4位二进制数可以转换为1位十六进制数(从右往左进行转换,位数不够补0)
2.2 、小数部分
- 十进制的小数的位权(从左往右)分别为10的-1次方,-2次方,-3次方。
- 二进制的小数的位权(从左往右)分别为2的-1次方,-2次方,-3次方。
- 二进制的小数转十进制与整数一样,都是展开位权进行求和运算
- 十进制的小数转二进制,小数部分除0.5(即乘2)直至小数部分为0,将每次计算结果的整数部分正序排列。(大多数十进制的小数转换为二进制的小数都是无限循环的)
3、二进制位运算
位运算就是直接对整数在内存中的二进制位进行操作。
符号位直接参与运算,将溢出的部分舍去,就的到正确的计算结果。
3.1逻辑操作
3.1.1 按位与(&)
规则:1&1=1、1&0=0、0&1=0,0&0=0;
通常用于二进制的取位操作。相同位的两个数字都为1,则为1;若有一个不为1,则为0.
例如一个数&1的结果就是取二进制的最末位。这可以用来判断一个整数的奇偶,最末位为1表示该数为奇数。
3.1.2 按位或(|)
规则:1|1=1、1|0=1、0|1=1,0|0=0
相同位只要一个为1即为1。通常用于二进制特定位上的无条件赋值,例如一个数|1的结果就是把二进制最末位强行变成1.如果需要把二进制最末位变成0,对这个数|1之后再减一就可以了,其实际意义就是把这个数强行变成最接近的偶数。
3.1.3 按位异或(^)
相同位不同则为1,相同则为0。
两次异或同一个数最后结果不变,即(a^ b)^ b=a;
3.1.4 按位取反(~)
not运算的定义是把内存中的0和1全部取反。
3.2 移位运算符
移位运算符组成的表达式也属于算数表达式,其值为算数值。
在移位运算时,byte、short和char类型移位后的结果会变成int类型,规定实际移动的次数是移动次数和32的余数,也就是移位33位和移位1位得到的结果相同。
3.2.1 左移运算符<<
规则:是将一个二进制的操作数按指定移动的位数向左移动,符号位不变,移出位被丢弃,右边移出的空位一律补0.
3.2.2 右移运算符>>
规则:将一个二进制位的操作数按指定移动的位数向右移动,符号位不变,右侧低位舍弃,左侧高位正数补0,负数补1.
3.2.3无符号右位移运算>>>
规则:右侧低位舍弃,左侧高位补0.
4 java中的数据类型
4.1 java中的整数类型
1.byte(1字节),short(2字节),int(4字节),long(8字节)。BigInteger(引用类型)。默认使用的是int
2.整数类型都是使用二进制补码存储。
3.多字节数据在存储和传输中的顺序:
①大端模式:高位字节放在低地址,低位字节放在高地址。
②小端模式:低位字节放在低地址,高位字节放在高地址。
每个字节的存储空间都有地址编号,数据是根据地址编号取出来的。
①高地址:地址编号大的。
②低地址:地址编号小的。
③高位字节:位权大的字节
④低位字节:位权小的字节
人类习惯的存储方式:大端模式,Java默认使用的也是大端模式。
4.2 java中的浮点类型
- 浮点数:数值数据的小数点位置不固定。
- 指数规则:任意实数,都可以由一个定点数(小数点的位置固定)乘以基数的整数次幂得到。
- 定点数部分:尾数,指数部分:阶码。
- 逻辑上采用(符号位,阶码,尾数)来表示一个数。
- 二进制浮点数标准:IEEE754
- 单精度float(4字节)和双精度double(8字节)
- float:1位符号位(1S),8位阶码位(8E),和23位尾数(M)
- double:1位符号位(1S),11位阶码位(8E),和52位尾数(M)
- 尾数M:纯小数形式,小数点在尾数最前端,通常为规约形式。
规约形式:在科学表示法下,小数最高有效位是1(整数部分)。
浮点数的阶码通常用移码来表示。移码:将数值正向偏移(2e-1),等于符号位
问题
补码为什么参与运算是正确的
byte的最小值为-128