Java基本数据类型+运算符
Java的基本数据类型
Java是一种强类型语言,每个变量都必须先声明其类型再使用。
一、整数类型
类型 | 占用存储空间 | 表述范围 |
---|---|---|
byte | 1字节 | -128~127 |
short | 2字节 | -2^15~2^15-1(-32768-32767) |
int(integer) | 4字节 | -2^31~2^31-1(约2亿) |
long | 8字节 | -2^63~2^63-1 |
2^16=65536
比long还大的整数用BigInteger
1. 整数常数的三种表示形式
-
十进制
- 一般生活中常用十进制
-
八进制
- 以0开头(1,2,3,4,5,6,7)
-
十六进制
- 以0x开头(1~9,a,b,c,d,e,f)
进制转换
Integer.toBinaryString() //转换为2进制字符串
Integer.toOctalString() //转换为8进制字符串
Integer.toHexString() //转换为16进制字符串
2. 整数常数默认类型
Java语言整数常数默认为int型,如果赋值时数据的大小没有超过byte/short/char的表述范围,可以自动转型。
声明long型常量可以在后面加”l”或”L”,一般加”L”,小写容易误认为是数字1。
二、浮点类型
类型 | 占用存储空间 | 表述范围 |
---|---|---|
float | 4字节 | -3.403E38~3.403E38 |
double | 8字节 | -1.798E308~1.798E308 |
float 单精度浮点型,尾数可以精确到7位有效数字
double 双精度浮点型,数值精度为float的两倍;
绝大部分应用程序都用double类型。
1. 浮点类型常量的两种表示形式
-
十进制
3.14
314.0
0.314 -
科学计数法
314E2:314*10^2->31400
314e2 : 314*10^2->31400
314E-2:314*10^-2->3.14
2. 浮点常数默认类型
- 浮点类型常数默认类型为double型,若要将其赋给float类型需要在后面加F/f
3. 浮点数误差问题
- 浮点数存在舍入误差,很多数不能精确表示,最好避免使用浮点数
- 如果要不产生舍入误差的精确数字计算可以使用BigDecimal。
Float f=0.1f;
Double d=1.0/10;
System.out.println(f==d);//Flase
三、字符型(char|2个字节)
单引号用来表示一个字符常量:如’A’是一个字符,它与”A”不同,”A”表示含有一个字符的字符串。
char类型内部采用Unicode编码表中的字符(Unicode:2,0~65535)
char是在0~65535的范围,运算时直接当做整数来运算,也可以把0~65535之间的整数直接转型为char(在整数前面用(char)强制类型转换)
-
Java中还允许使用转义字符’\’来将其后面的字符转变为其他含义:
\b: 退格
\n: 换行
\r : 回车
\t : 制表符(Tab)
\’ :单引号
\” :双引号
\\:反斜杠
小例子(循环打印A~Z)
public class TestCharType
{
public static void main(String args)
{
char c1='A';
for(int i=0;i<26;i++)
{
char Temp=(char)(c1+i);
System.out.print("\t"+Temp);
}
}
}
ASCII码表:ASCII码对照表
四、布尔型(boolean|不是一个字节是一位)
有两个值:True 和 False
用来判断逻辑条件,一般用于程序流程的控制
五、基本数据类型自动转换强制转型类型提升问题
- 自动类型转换
- 容量小的数据类型可以自动转换为容量大的数据类型;
- 容量指的是表数范围而不是字节数;
图中,黑色实线箭头表示无数据丢失的自动类型转换,而红色虚线在转换时可能存在数据丢失。
特例:
可以将整型常量直接赋值给byte、short、char等类型变量,而不需要进行强制类型转换,只要不超过其表数范围。
-
强制类型转换
用于显式的转换一个数值的类型
当将一种类型强制转换为另一种类型而又超出了目标类型的表数范围,就会被截断成为一个完全不同的值,无意义的值!
强制类型转换:(转换类型)转换的变量 例:(char)(a+2)
-
表达式中类型提升问题
- 在混合多种数据类型的表达式中,类型会向容量大的值的数据类型提升
自动类型转换中的值溢出问题
int money=100000000;
int years=20;
long total=money*years;
//返回的是负数,因为money和years都是int类型,相乘也为int,但其值超过了int的表数范围,所以溢出。
//错误修改
long total=(long)(money*years);
//正确修改
long total=(long)money*years;
//算一个人70年心跳多少次
long times=70*60*24*356*70;//溢出
//一般我们优先对第一个数进行类型转换(可能前面就已经溢出)
long times=70L*60*24*365*70;
运算符
- 算术运算符: +,-,*,/,%(取余数),++,- -
- 赋值运算符 =
- 关系运算符: >,<,>=,<=,==,!= instanceof
- 逻辑运算符: &&,||,!
- 位运算符: &,|,^,~ , >>,<<,>>> (了解!!!)
- 条件运算符 ?:
- 扩展赋值运算符:+=,-=,*=,/=
1. 算数运算符
整数运算:
- 如果两个操作数有一个为long, 则结果也为long
- 没有long时,结果为int。即使操作数全为shot、byte结果也是int.
浮点运算:
- 如果两个操作数有一个为double, 则结果为double.
- 只有两个操作数都是float, 则结果才为float.
取模运算
其操作数可以为浮点数,一般使用整数。如:5.9%3.9=2.000000004
-
要点:
- 负数%负数=负数;
- 负数%正数=负数;
- 正数%负数=正数;
- 注:一般都是正整数运算,不用考虑这么细!
一元运算符(++, - -)
int a = 3;
int b = a++; //执行完后,b=3。先给b赋值,再自增。
int c = ++a; //执行完后,c=5。先自增,再给c赋值
注意:
//java中的乘幂处理:
int a = 3^2; //java中不能这么处理, ^是异或符号。
double b = Math.pow(3, 2);
//Math类提供了很多科学和工程计算需要的方法和常数。
2. 逻辑运算符
- 逻辑与:&& 和 &, 逻辑或:|| 和 |, 逻辑非:!。
- 逻辑与和逻辑或采用短路的方式。从左到右计算,如果确定值则不会再计算下去。
- 逻辑与只要有一个为false, 则直接返回false.
- 逻辑或只要有一个为true, 则直接返回true;
- boolean c =1>2&&2>(3/0); (除数为0编译能通过,执行是抛出异常)
3. 位运算符
~--取反(注意符号问题)
&--按位与
|-- 按位或
^-- 按位异或
0 1 0 1
1 0 0 1
- - - -
1 1 0 0
<<:左移运算符 //左移一位相当于乘2
>>:右移运算符 //右移一位相当于除2取商。
>>>:无符号移位运算符
int a = 3*2*2;
int b = 3<<2; //相当于:3*2*2;
int a = 12/2/2;
int b = 12>>2;
4. 三目条件运算符
三目条件运算符,语法格式:x ? y : z
- 其中 x 为 boolean 类型表达式,
- 先计算 x 的值,若为true,则整个三目运算的结果为表达式 y 的值,
- 否则整个运算结果为表达式 z 的值。
int score = 80;
int x = -100;
String type = score < 60 ? "不及格" : "及格";
int flag = x > 0 ? 1 : (x == 0 ? 0 : -1);
System.out.println("type= " + type);
System.out.println("flag= "+ flag);
5. 扩展运算符
6. 字符串连接符
- “+”运算符两侧的操作数中只要有一个是字符串(String)类型,系统会自动将另一个操作数转换为字符串然后再进行连接。
int c = 12;
System.out.println("c=" + c); //c12
运算符优先级的问题
- 不需要去刻意的记住他,表达式里面优先使用小括号来组织!!
上一篇: JAVA - 基本数据类型与运算符
下一篇: R语言学习总结---基本数据类型