-
数据类型
-
强类型语言
- 要求变量的使用严格符合规定,所有变量必须先定义后才能使用。
- java、.NET、C/C++
-
弱类型语言
- 相较于强类型语言的规定和要求较为宽松。
- vb,php,JavaScript
-
Java的数据类型分为两大类
- 基本数据类型(primitive type)
- 引用数据类型(reference type)
public class demo2 { public static void main(String[] args) { //八大基本数据类型 //整数 int num1 = 10;//最常用 byte num2 = 20; short num3 = 30; long num4 = 30L;//long类型要在数字后面加个l //浮点数:小数 float num5 = 50.1f;//float类型要在数字后面加个f double num6 = 3.1415926d; //字符类型 char name = 'a'; //字符串,String不是关键字,是类 String namea = "希文"; //布尔值 boolean flag = false;
补充知识
-
字节
-
位(bit):是计算机内部数据储存的最小单位,11001100是一个八位二进制数。
-
字节(byte):是计算机中数据处理的基本单位,习惯上用大写B来表示。
-
1B(byte,字节)=8bit(位)
-
字符:是指计算机中使用的字母、数字、字和符号
-
-
转换
-
1bit表示一位
-
1Byte表示一个字节 1B=8b
-
1024B=1KB
-
1024KB=1M
-
1024M=1G
TIPS:一个英文字母为8位,即1个字节;一个汉字为16位,即2个字节。
简单区分一下32位和64位操作系统的区别
- 32位的cpu处理器,只能安装32位的电脑操作系统;
- 64位的cpu处理器,则可以安装32位和64位操作系统,所以64位处理器是向下兼容的;
- 但是,如果真的在64位处理器的电脑上面安装32位操作系统,那么会导致处理器的性能无法充分发挥。
-
-
类型转换
-
由于Java是强类型语言,所以要进行有些运算的时候,需要用的类型转换。
低----------------------------------------------------高
byte,short,char→int→long→float→double
#### 这里的低-----高其实是精度的由低到高!
小数的优先级一定大于整数!
-
运算中,不同类型的数据先转化为同一类型,然后再进行运算。
-
强制类型转换:(类型)变量名→高-----低
-
自动类型转换:不需要任何操作→低-----高
public class demo5 { public static void main(String[] args) { int i = 128; double b = i; System.out.println(i); System.out.println(b); //强制转换类型:(类型)变量名→高--低 /*byte b = i;//转换前 byte b = (byte)i;//转换后 */ //自动转换 不需要加任何东西 低--高 /* 注意点: 1.不能对布尔值进行转换 2.不能把对象类型转换为不相干的类型 3.在把高容量转换到低容量的的时候,强制转换 4.转换的时候可能存在内存溢出,或者精度问题。 */ System.out.println("=========================="); System.out.println((int)23.7); //23 System.out.println((int)-45.89); //45 System.out.println("=========================="); char c = 'a'; int d = c+1; System.out.println(d); System.out.println((char)d); } }
溢出问题(重点)
-
public class demo06 {
public static void main(String[] args) {
//操作比较大的数的时候,注意溢出问题。
//JDK新特性,数字之间可以用下划线分割,符合四位分级,并不会输出下划线。
1.int money = 10_0000_0000;
System.out.println(money);
2.int years = 20;
int total = money*years;//-1474836480,计算的时候溢出了
System.out.println(total);
3.long total2 = money*years;//默认是int,转换为long之前已经出现问题了(溢出了)
System.out.println(total2);
4.long total3 = ((long)money)*years;
//先把一个数转换为long(money和years都行,任选其一),整个表达式都提升为long了.这样就 可以避免溢出了。
System.out.println(total3);
}
}
重点分析一下
- 新知识点
- JDK新特性:数字之间可以用下划线分割,符合四位分级,并不会输出下划线。适合我们中国人的一个习惯。非常nice!
- 溢出问题
- 溢出问题:money已经超出了int类型的范围,溢出了。
- 问题滞留
- 这里为什么输出结果还是错的呢,这里涉及到的问题就是在转换为long类型之前。已经出现溢出问题了,到达long这里的时候就是一个有问题的数据。
- 解决方案:
-
先把一个数转换为long(money和years都行,任选其一),整个表达式都提升为long了.这样就 可以避免溢出了。
-
底层原理:
- 概念:在Java中,如果两个操作数的类型不同,编译器会将它们都提升到更高的数据类型,并执行操作。这个过程称为**“数据类型提升”**。
- 规则:Java会将较低的数据类型自动转换为较高的数据类型,以便进行操作。
- 实操:在乘法操作中,如果一个操作数是
int
类型,而另一个是long
类型,Java会自动将int
类型提升为long
类型,然后执行乘法操作。
为什么呢?
因为
long
类型的范围比int
类型更大,可以容纳更大的值,所以将int
类型提升为long
类型可以避免溢出问题。
是 int
类型,而另一个是 long
类型,Java会自动将 int
类型提升为 long
类型,然后执行乘法操作。
为什么呢?
因为 long
类型的范围比 int
类型更大,可以容纳更大的值,所以将 int
类型提升为 long
类型可以避免溢出问题。
综上:因此,即使
money
是int
类型,years
是long
类型,Java会自动将money
提升为long
类型,然后执行乘法操作,以确保乘法操作在long
类型范围内进行,避免溢出问题。