小数的二进制转换:
十进制小数转二进制
十进制小数转换成二进制小数采用"乘2取整,顺序排列"法。具体做法是:用2乘十进制小数,可以得到积,将积的整数部分取出,再用2乘余下的小数 部分,又得到一个积,再将积的整数部分取出,如此进行,直到积中的小数部分为零,或者达到所要求的精度为止。
案例一: 把(0.8125)转换为二进制小数。
解:
案例二: 把十进制小数0.625 转为二进制小数.
解:
0.625=(0.101)B
0.625*2=1.25======取出整数部分1
0.25*2=0.5========取出整数部分0
0.5*2=1==========取出整数部分1
二进制小数转十进制
案例三: 把十进制小数0.1 转为二进制小数
注意: 十进制的小数并不是都能够用二进制表示的.
例如: 十进制0.1 转为二进制时,只能得到一个近似值 0.0001100110011001
二进制小数转十进制
0.101 二进制转为10进制。
解:
1*2^(-1)+0*2^(-2)+1*2^(-3))=0.5+0.125=0.625
浮点数的表示方法:
Java 语言支持两种基本的浮点类型: float 和 double ,以及与它们对应的包装类 Float 和 Double 。它们都依据 IEEE 754 标准,该标准为 32 位浮点和 64 位双精度浮点二进制小数定义了二进制标准。
IEEE 754 用科学记数法以底数为 2 的小数来表示浮点数。IEEE浮点数用 1 位表示数字的符号,用 8 位来表示指数,用 23 位来表示尾数,即小数部分。作为有符号整数的指数可以有正负之分。小数部分用二进制(底数 2)小数来表示,这意味着最高位对应着值 ?(2 -1),第二位对应着?(2 -2),依此类推。对于双精度浮点数,用 11 位表示指数,52 位表示尾数。IEEE浮点值的格式如图 1 所示。
图 1. IEEE 754 浮点数的格式
请问浮点数9.0,如何用二进制表示?还原成十进制又是多少?
首先,浮点数9.0等于二进制的1001.0,即1.001×2^3。
那么,第一位的符号位s=0,有效数字M等于001后面再加20个0,凑满23位,指数E等于3+127=130,即10000010。
所以,写成二进制形式,应该是s+E+M,即0 10000010 0010000 0000 0000 0000 0000。
在数学中是将正号+ 负号- 放在绝对值前边表示该数是正数还是负数的,计算机只能识别0和1,使用的是二进制。计算机中就用一个数的最高位作为符号位,并用0表示正数,1表示负数。这样数的符号也可以用数字表示了。在计算机中,负数的二进制有3种表示方法:原码、反码和补码。任何正数的原码反码和补码形式完全相同,而负数则有各种不同的表示形式。
那么在计算机中,我们用二进制来表示数,所有的数可以分成两部分。一部分是符号,另一部分是数值,所以用二进制表示出来的数也就有了符号位和数值位之分。如果只表示一个数,我们称之为:真值;既有数又有符号的我们称之为机器码。
正整数:
原码,补码,反码的符号位固定为0,数值位都是真值。所以一个正整数的原码,补码,反码是相同的。
负整数:
原码,补码,反码的符号位固定为1不变,数值位不相同。
原码的数值位是真值;
反码:原码数值位的每一位二进制数位求反得到;
补码:反码数值位最低位加1得到。
一.原码
8
原码:0000,1000
-8
原码:1 000,1000
二.反码
8
反码:0 000,1000
-8
反码:1 111,0111
三.补码
8
补码:0 000,1000
-8
补码:1 111,1000
为什么要用到原码、反码、补码
原码求和运算的问题:
假设字长为8bits
十进制 (1) 10 - (1)10= (1)10 + (-1)10 = (0)10
按照原码的表示规则,十进制的1 的原码是 00000001, 十进制的-1 原码是 10000001
二进制 (0 0000001)原 + (1 0000001)原 = (1 0000010)原 = ( -2 ) 显然不正确。
当1-1 就相当于 1+(-1) 执行二进制运算时结果为10000010 是-2 结果是错误的!!!
解决问题方案:
在两个整数的加法运算中是没有问题的,于是就发现问题出现在带符号位的负数身上。对除符号位外的其余各位逐位取反就产生了反码。反码的取值空间和原码相同且一一对应。
反码的减法运算:
十进制: (1)10 - (2)10 = (1)10 + (-2)10= (-1)10
二进制: (0 0000001)反 + (1 1111101)反 = (11111110)反 = (-1) 正确。
反码求和运算的问题:
十进制: (1)10 - (1)10= (1)10 + (-1)10 = (0)10
二进制:(0 0000001)反 + (1 1111110)反 = (1 1111111)反 = ( -0 ) 有问题。
问题出现在(+0)和(-0)上,在人们的计算概念中零是没有正负之分的。
补码求和运算:
负数的补码就是对反码加一,而正数的补码不变,正数的原码反码补码是一样的。
十进制: (1)10 - (1)10= (1)10 + (-1)10 = (0)10
二进制:(0 0000001)补 + (1 1111111)补 = (0 0000000)补 = ( 0 ) 正确。
十进制:(1)10 - (2)10= (1)10 + (-2)10 = (-1)10
二进制:(00000001)补 + (11111110)补 = (11111111)补 = (-1) 正确。
所以补码的设计目的是:
⑴ 使符号位能与有效值部分一起参加运算,从而简化运算规则。补码机器数中的符号位,并不是强加上去的,是数据本身的自然组成部分,可以正常地参与运算。
⑵ 使减法运算转换为加法运算,进一步简化计算机中运算器的线路设计
[常量]
程序中固定不变的值
整形
长整形
浮点型
字符型
字符串(不是基本数据类型)
布尔型
null
[变量]
程序中一块有名字的内容,存储数据, 可以重复使用.
变量的声明
数据类型 变量名;
变量的初始化
变量名=数值;常量|表达式;
使用变量
通过变量名可以获取变量存储的数据.
注意:
变量的有效的取值范围...
...
[运算符]
1.算术运算符
+ - * / % ++ --
2.赋值运算符
+= -= *= /= %=
3.比较运算符
布尔结果
== != > < >= <= instanceof
4.逻辑运算符
针对布尔值进行运算.会产生一个新的布尔值.
&
两边必须都为true,结果才为true
|
两边必须都为false,结果才为false
!
! true : false
! false : true
^
两边相同结果为false
两边不同结果为true.
&&
短路与, 当&& 左边为false,结果直接为false右边不在运算.
||
短路或, 当|| 左边卫true,结果直接为true....
5.位运算
直接操作二进制...
技巧0 变false 1 视为true. 就可以和逻辑运算符结合了...
&
|
^
当一个数异或同一个数两次结果还是那个数...
~ 将0 变1,1 变0 ,取反...
6.移位运算
<<
>>
>>>
7.三元运算符
条件表达式? 值1: 值2;
条件表达式: 返回布尔结果...
当条件表达式为true, 取值1, 当条件表达式位false ,取值2.
[数据类型的转换]
自动类型提升:
byte->short->int->long ->float ->double
char -> int
强制类型转换:
保留小数点的整数部分...
将(Unidoe数值转为字符..
int i=1;
byte b=(byte)i;
注意: 由于是将较大的类型的数值,赋值给了较小的类型的变量. 会溢出的问题...
使用要谨慎... (程序员自行处理了)
表达式的自动类型提升:
byte b1=1;
byte b2=2;
b1=b1+b2; // 编译报错.
执行+ 算术运算, byte 类型会自动提升为int 再运算...
byte short char 自动提升为int .
当参与运算的数,最大类型是long ,结果为long
当参与运算的数,最大类型是float ,结果为float
...
作业:
day02的作业.
day02 文档中的练习题.
计算5000秒是多少小时,分钟,秒
交换数值
int i=3;
int j=5;
三种方式.