—— 目录 ——
◉ 结晶回路准备
① 各变量的取值范围
类型 | 取值范围 |
---|---|
byte | -128 ~ 127 |
short | -128 ~ 127 |
int | -2147483648 ~ 2147483647 |
char | 0 ~ 65535 |
② 数据类型大小排序
byte < short == char < int < long < float < double
◉ Java数据类型(与C作比较)
(一) char类型占2个字节,所以一个汉字是合法的字符
— [ C语言 ] char类型只占1个字节,无法表示一个汉字
(二) 不允许空字符,编译不通过
— [ C语言 ] 在这里与 Java 一样,不支持空字符
(三) 整型字面值默认为int,超过范围编译不通过
虽然该数并没有超过long的范围,但却超过了int的,所以会报错编译不通过!!解决办法是在数字后边加上l或L。
— [ C语言 ] 不会报错,直接变成了-2147483648【注意是以补码形式存放的】
(四) 浮点型字面值默认为double,,超过范围编译不通过
(五) 大容量类型不能转化成小容量的,必须强制转化
Tips:
- 第一行long a = 10;中整形字面量10默认为int,赋值给long发生自动转化。
- 最后一行float f = 3.1; 中浮点型字面量3.1默认为double,赋值给float时为大容量赋值给小容量,编译不通过
— [ C语言 ] 不会报错,直接截取低位,存在数据溢出问题
— 但有例外:byte,short,char都可以直接用整型字面值赋值(前提是范围不超出),而不用强制转换。如:
前3个右边字面值为整型默认是int,而左边确实比int小的类型,理论上要强制转化不然会编译出错,但却例外地通过了。
— 非常注意:该例外仅限于字面值,换成变量就不行了,如:
原因时编译器检测到变量a为int类型,不能转化为byte类型,需要用到强制转化。
(六) 布尔类型注意点
在Java中使用布尔类型时,不能用0和非0对其赋值,理由是0和非0是字面值默认为int,不能将int赋值给boolean,只能使用true和false
— [ C语言 ] 0表示假,非0表示真,且逻辑运算结果一定为 0 或 1
(七) 混合运算注意点
当byte,short,char混在一起进行运算时,都统一转换成int类型进行运算
以上编译不通过,时因为 a 和 b 都自动转化成int类型了,再赋值给 j 属于大容量赋给小容量,不行,应该强制转化加上(short)。
但是注意:写 short j = 1 + 2;
却是可以编译通过的,原因在于上面的特例,byte, short, char都可以直接用整型字面值赋值(只要不超出范围),注意仅限于字面值,换成变量(如上面情况)就不行了。
— [ C语言 ] 不会报错,正确执行
2021 - 1 - 31
(八) 浮点数可以除以 0 , 结果为无穷或非数(NaN)
float a = 1, b = -1, c = 0;
System.out.println(a / 0);
System.out.println(b / 0);
System.out.println(c / 0);
System.out.println(1 / 0);
运行结果:
Infinity
-Infinity
NaN
Exception in thread "main" java.lang.ArithmeticException: / by zero
可见:
- 正浮点数除以 0 为正无穷,负的为负无穷
- 0 除以 0 得到非数 NaN(doiuble一样)
- 而整型不能除以 0 ,会报错
- 另外,浮点型对 0 求模(%)也是得到非数NaN,整型同样报错
— [ C语言 ] 在这里和 Java 一样,只是%两边只能为整型
2021 - 2 - 2
(九) 无穷、非数的比较
double a = 2.0 / 0;
double b = 3.0 / 0;
System.out.println( a == b );
double c = 0.0 / 0;
double d = 0.0 / 0;
System.out.println( c == d );
这段代码的输出
咋一看应该是:false true
但其实结果是:true false
What?非人逻辑?这到底怎么肥事?
原因:在Java中
- 所有正无穷都相等
- 所有负无穷都相等
- 所有非数NaN都不相等(哪怕 NaN == NaN 结果也是 false )
再测试一下:
Java:
System.out.println( Double.NaN == Double.NaN);
——> 输出:false
C:
printf("%d ", NAN == NAN);
printf("%d ", 1.0 / 0.0 == 2.0 / 0.0);
——> 输出:0 1
— [ C语言 ] 从上面可见C语言在此与 Java 一样
(十) 科学计数法默认为double型
火苗飞舞的方向,将洞穿一切黑暗(寒冰小澈)