Java语法基础二

 整型有4种:byte字节整、short短整、int整、long长整

java中的数据采用的是补码的存储方式

计算机中存储数据有3种不同的方式,分别是原码、反码和补码

byte:1B(8b),-128到127

byte k = 100;//语法正确100在指定范围内 
byte kk = 130;//语法报错,因为130超出byte的存储范围限制 
//这里的面试点在常量池

short:2B,-32768到32767

int:4B,-2147483648到2147483647

long:8B:-92233720368547758089223372036854775807

如果需要要使用具体的上下限取值,可以通过包装类中的常量进行使用

System.out.println(Integer.MAX_VALUE); 
System.out.println(Integer.MIN_VALUE);

十进制整数。如123,-4560

八进制整数。以0开头,如0123表示十进制数83,-011表示十进制数-9

十六进制整数。以0x0X开头,如0x123表示十进制数291,-0X12表示十进制数-18

a-->10  b-->11  c-->12  d-->13  e-->14  f-->15

二进制整数,以0b0B开头,例如0b10110010

int k1=123; 
int k2=0123; 
int k3=0x123; 
int k4=0b100101; 
System.out.println(k1+"\t"+k2+"\t"+k3+"\t"+k4);//具体输出时,系统会自动将k2转换为10进制输出

可以通过包装中提供的方法将十进制转换为2、8和16进制

int k = 123; 
String ob=Integer.toBinaryString(k);//将十进制数转换为2进制的字符串 
System.out.println(ob); //1111011 

String oo=Integer.toOctalString(k); 
System.out.println(oo); //173 

String oh=Integer.toHexString(k); 
System.out.println(oh);//7b

整数类缺省为int类型,如在其后有一个字母“l或者L”表示一个long

123系统会自动识别为int类型
123L或者123l系统自动识别为long

浮点数类型

float单精度、double双精度

        1、float4B,可以保证小数点后6位有效精度和第7位的部分精度 e38

        2、double8B,可以保证小数点后15位有效精度和第16位的部分精度。e308

        3、浮点数是无法精确存放的,原因在于将浮点数转换为补码时的限制

double res = 0; 
for (int i = 0; i < 10; i++) 
    res += 0.1; 
System.out.println(res); //0.9999999999999999

        4、针对浮点数则不能使用等值判断

Java浮点数都是用科学计数法来存储数据的,无论是单精度还是双精度在存储中都分为三个部分:

        1、符号位Sign : 0代表正,1代表为负,是第一位

        2、指数位Exponent:用于存储科学计数法中的指数数据,单精度为8位,双精度11位。用指数部分的值(8位/11unsigned)的值减去偏移附加值得到该数实际的指数。例如值为200,实际指数为73=200-127,对于双精度的double来说常量1023

        3、尾数部分Mantissa

double d = 0.1d; 
long l = Double.doubleToLongBits(d); //long类型和double类型都是64位的,他们的内存大小一样,这个
//函数的做法就是把double对应的内存结构复制到同样大小的long类型变量的内存结构中.返回这个long值 System.out.println(t.getLongBits(l));

样例17.625在内存中的存储为:

        1、首先要把17.625换算成二进制:10001.101

                ①整数部分:除以2,直到商为0,余数反转

                ②小数部分:乘以2,直到乘位为0,进位顺序取。(即:乘2取整法)

        2、再将10001.101右移,直到小数点前只剩1位,1.0001101*2^4 ,右移动了四位。

底数:因为小数点前必为1,所以IEEE规定只记录小数点后的就好。所以,此处的底数为0001101

指数:实际为4,必须加上127(转出的时候,减去127/1023),所以为131。也就是10000011

        3、符号:因为是正数,所以是0

        4、综上所述,17.625在内存中的存储格式是:01000001 10001101 00000000 00000000

在Java中浮点数无法精确存放,除非使用BigDecimal

float:4B:1.4E-453.4028235E38 保存7-8位有效数据

double:8B:4.9E-3241.7976931348623157E308 保存15-16位有效数据

注意:浮点数无法正确存放

表示方法:

        1、十进制数形式。由数字和小数点组成,且必须有小数点,如0.123, 1.23, 123.0

        2、科学计数法形式。如:123e3123E-3,其中eE之前必须有数字,且eE后面的指数必须为整数

        3、f或者F表示float,而d或者D代表double。例如123f或者123.45D,系统默认为double类型

Java精确计算问题

关键字strictfpstrict float point的缩写,指的是精确浮点,它是用来确保浮点数运算的准确性。

JVM在执行浮点数运算时,如果没有指定strictfp关键字,此时计算结果可能会不精确,而且计算结果在不同平台或厂商的虚拟机上会有不同的结果,导致意想不到的错误。而一旦使用了strictfp来声明一个类、接口或者方法,那么在所声明的范围内,Java编译器以及运行环境会完全依照IEEE二进制浮点数算术标准来执行,在这个关键字声明的范围内所有浮点数的计算都是精确的。

需要注意的是,当一个类被strictfp修饰时,所有方法都会自动被strictfp修饰。因此,strictfp可以保证浮点数运算的精确性,而且在不同的硬件平台会有一致的运行结果。但是精确计算事实上还是没有得到保障,这是受到存储方式的限制。需要精确计算还是以来BigDecimal实现的。

常见数学计算

Java的Math类中包含了用于执行基本数学运算的属性和方法,如初等指数、对数、平方根和三角函数。

Math的方法都被定义为static 形式,通过Math类可以在主函数中直接调用。

        1、Math.sqrt()计算平方根

int k=16; //如果不能执行计算,则返回NaN 
double res=Math.sqrt(k); 
System.out.println(res);

        2、Math.pow(a, b)计算ab次方

        3、Math.max(a,b)计算最大值   Math.min(a,b)计算最小值

        4、Math.abs()求绝对值

        5、Math.ceil天花板的意思,就是返回大的值;floor地板的意思,就是返回小的值;round四舍五入,float时返回int值,double时返回long

double d1=-1234.567; 
System.out.println(Math.ceil(d1));//-1234.0 
System.out.println(Math.floor(d1));//-1235.0 
System.out.println(Math.round(d1)); //-1235 容易出错的位置 

d1=1234.567; 
System.out.println(Math.ceil(d1)); //1235.0 
System.out.println(Math.floor(d1));//1234.0 
System.out.println(Math.round(d1)); //1235

        6、random 取得一个大于或者等于0.0小于不等于1.0的随机数

字符类型char

Java中存放字符采用的是Unicode编码字符集,2B0-65535

        1、字符类型的变量可以当作整数使用

        2、char c='a'; 注意:这里使用的是单引号,不是双引号,单引号中只能包含一个字符

                需要记忆: '0' < 'A' <'a'

        3、Java也提供转义字符,以反斜杠(\)开头,将其后的字符转变为另外的含义

\ddd 138进制数所表示的字符(ddd) 例如'\110'实际就是字符H
\uxxxx 1416进制数所表示的字符(xxxx),例如'\u9110'表示字符''
\’ 单引号字符,例如'\''
\" 双引号字符,例如'"'实际上是可以的,但是这样写可读性非常差,所以建议使用'\"'
\\ 反斜杠字符

基本使用

char c='h'; 
System.out.println((int)c); //获取'h'字符对应的unicode编码值 104 
//GB2312 

System.out.println(c); 

// c='ab' 语法报错,因为只能对应一个字符 

//引入转移字符 
c='\''; 
c='\110'; 
System.out.println(c);//H 
System.out.println((int)c);//72 

c='\u0050'; 
System.out.println(c); //P 
System.out.println((int)c);//80

布尔类型  boolean

boolean 数据类型有两种文字值:true真和false

在Java编程语言中boolean类型只允许使用boolean值,在整数类型和boolean类型之间无转换计算

boolean类型被编译为int类型,等于是说JVM里占用字节和int完全一样,int4个字节,于是boolean也是4字节
boolean数组在OracleJVM中,编码为byte数组,每个boolean元素占用8=1字节

基本数据类型转换

小转大自动转换

byte b1=123; 
long k1=b1; 
double kk=k1; 
System.out.println(kk); 

long kk = 123456L; 
float ff=kk; //没有错误。float 4B long 8B

大转小需要强制转换

double dd=123.567; 
long kk=(long)dd; 
System.out.println(kk);

类型转换的语法:

int k=100; 
char cc=(char)k; //强制类型转换:窄化操作 

char k='d'; 
System.out.println((int)k); 

boolean bb=true; 
System.out.println((int)bb);//因为boolean类型和数值类型之间没有任何对应关系,所以这里的强转会报语法错误

double

float f1=123.456;//语法报错,因为系统默认带小数点的数据为double类型,所以123.456是double 类型的数据,而声明f1为float,所以这里需要进行数据类型转换或者进行特殊声明。如果浮点数转换为整数 是直接截断小数部分。 

float f1=(float)123.456; 

float f1=123.456f; //数字末尾的f类似于数字末尾的L,用于进行数据类型的说明,f/F表示这是一个 float类型的数据 d/D表示是一个double类型的数据

复合数据类型

复合数据类型包括:class类、interface接口、数组。

null索引在运行时并没有对应的类型,但它可以被转换为任何类型(不能是简单类型)。

索引类型的默认值就是null

常量

常量就是指在程序执行期间其值不能发生变化的数据,常量是固定的。如整型常量123,实型常量1.23,字符常量'A',布尔常量true

需求:要求用户键盘输入一个整数的半径值,计算圆的面积

Scanner sc = new Scanner(System.in); 
System.out.println("请输入半径值:要求整数"); 
int r=0;//定义一个变量 
r=sc.nextInt();//会等待用户输入整数值,如果不正确则会有红色报错信息 
//计算园的面积 
double res=3.14*r*r; //Math.pow(r, 2) 
//输出计算结果 
System.out.println("半径值为"+r+"的圆形面积为"+res);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值