【Java之轨迹】第一章:数据类型总结(当C语言遇上Java)


◉ 结晶回路准备

① 各变量的取值范围

类型取值范围
byte-128 ~ 127
short-128 ~ 127
int-2147483648 ~ 2147483647
char0 ~ 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型

在这里插入图片描述


火苗飞舞的方向,将洞穿一切黑暗(寒冰小澈)

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

寒冰小澈IceClean

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值