10-基本数据类型的更多语法点
原创2023年1月9日大约 6 分钟...约 1899 字
0. 目录
- 变量要先赋值后使用
- 计算并赋值运算符
- 数据类型自动转换
- 强制类型转换和数字溢出
- 从数值计算溢出,理解程序员和编程语言
1. 变量要先赋值后使用
- 不给变量赋值代表什么
- 不赋值就使用会怎么样
public class AssignFirst {
public static void main(String[] args) {
int a;
int b = a + 1; // 其实就是没有初始化
/*java: 可能尚未初始化变量a
* 初始化,就是你要给他赋值,你创建变量的时候要给它一个值。
* 如果你不用这个变量 a 直接声明变量也是可以的*/
}
}
解决方法1:
public class Solution_AssignFirst {
public static void main(String[] args) {
int a = 1;
int b = a + 1;
System.out.println(b);
}
}
解决方法2:
public class Solution_AssignFirst {
public static void main(String[] args) {
int a;
a = 1;
int b = a + 1;
System.out.println(b);
}
}
解决方法3:
public class Solution_AssignFirst {
public static void main(String[] args) {
int a;
}
}
2. 计算并赋值运算符
2.1 计算并赋值运算符
- 作用是为了让代码更简洁。比如 a = a +10,可以简化为 a += 10;
+=
-=
/=
*=
%=
&=
^=
|=
<<=
>>=
>>>=
public class CalcAndAssign {
public static void main(String[] args) {
int a = 8;
a >>= 2;
System.out.println(a);
}
}
3. 数据类型自动转换
3.1 自动类型转换
- 不会出现问题的类型转换,编程语言可以做自动类型转换,比如低精度的数字向高精度的数字转换。
- 自动类型转换可以发生在算数运算,也可以发生在赋值。
- 「之前的
1/3.0
其实也是自动类型转换,自动转到浮点数」
public class AutoConvert {
public static void main(String[] args) {
int a = 99;
// int b = 5;
double b = 5;
System.out.println(a / b);
}
}
3.2 数值精度顺序:double>float>long>int>short>byte
int>char
:char 可以无损到 int
3.3 char 可以转换为 int
- char 可以转换为 int
- 虽然同样是两个 byte,但是因为 char 是无符号数,值域超出了 short 可以表示的范围,所以不可以自动转为 short。
AutoConvert
public class AutoConvert {
public static void main(String[] args) {
/*int 是 4 byte,long 是 8 byte,所以对于计算机来说,
虽然不合适,但是 long 可以包容 int 这个 4 byte 所以可以自动转换。
下面几个代码都是一样的,就是要告诉你 Java 会自动帮我们把数据从低精度
转到高精度——隐性转换*/
int intVal = 99;
long longVal = intVal;
long longVal2 = intVal + 1;
System.out.println(longVal2);
float floatVal = 11.32f;
double doubleVal = floatVal;
double doubleVal2 = floatVal * 2;
System.out.println(doubleVal2);
doubleVal = longVal;
doubleVal = intVal;
floatVal = intVal;
floatVal = longVal;
char ch = 'A';
int chNum = ch;
int chNumCalc = ch + 10;
System.out.println(ch);
System.out.println(chNum);
int a = 99;
// int b = 5;
double b = 5;
System.out.println(a / b);
}
}
demo
public class demo {
public static void main(String[] args) {
char ch = 'a';
int intCh = ch;
System.out.println(ch);
System.out.println(intCh);
// int a = 97;
// char ch1 = a; // java: 不兼容的类型: 从int转换到char可能会有损失
char ch1 = 'a' + 1;
System.out.println(ch1);
System.out.println('a' + 1);
}
}
4. 强制数据类型转换
4.1 强制类型转换
- 可能出现问题的类型转换,需要使用强制类型转换,比如高精度数值向低精度数值转换;
- 强制类型转换也是操作符;
- 语法是用小括号括起来的目标类型放在被转换的值前面;
- 强制转换会造成数据精度丢失。「比如 8 byte 到 4 byte ,那这样就会丢失」
ForceConvert
public class ForceConvert {
public static void main(String[] args) {
int intVal = 99;
long longVal = 19999;
// intVal = longVal;
/*直接赋值会出错
报错内容:java: 不兼容的类型: 从long转换到int可能会有损失
Java计算机表示:这个损失,我决定不了,得你来决定;
程序员:得我们自己来决定是否转换,所以需要强制转换
(int) longVal-> 我知道,可以转的。——我允许你强制转换了*/
intVal = (int) longVal;
float floatVal = 11.32f;
double doubleVal = 3344556.789;
floatVal = (float) doubleVal;
int a = 65;
char b = (char) a;
}
}
ForceConvertValueLoss
public class ForceConvertValueLoss {
public static void main(String[] args) {
int intVal = 99;
long longVal = 5555555555555L;
// long: 101 0000 1101 1000 0000 1110 1010 0101 1000 1110 0011
// int:
/* 1 字节(byte) = 8 位(bit)
* 比如:long 是 8 byte,int 是 4 byte
* 你说好巧不巧,后面 4 个 byte 的开头不恰巧就是 1,也就成了负数。*/
intVal = (int) longVal;
System.out.println(intVal);
float floatVal = 11.32f;
double doubleVal = 1234567890.123456;
floatVal = (float) doubleVal;
System.out.println(floatVal);
System.out.println(doubleVal);
}
}
输出:
-2132125469
1.23456794E9
1.234567890123456E9
E 代表 10,E9 代表 10的9次方
char ch = 'a';
char upper_char = (char) (ch - 32); // 强制转换语法,功能是小写转大写
// (类型) 表达式
System.out.println(upper_char);
char ch2 = 'A';
char lower_char = (char) (ch2 + 32); // 强制转换语法,功能是大写转小写
// (类型) 表达式
System.out.println(lower_char);
4.2 数值溢出
- 数值计算一旦溢出,结果将失去其原有意义。比如,两个正数会加出负数。
- 要对能够处理的值有大概的估计「也就是要对我们要处理的值,有个期待。就算你拿 byte 去表示第几月都是可以的,最多就 12个月,byte 有 128 也是足够了(一个月第几号也是够的)当然,我们一般也是用 int 表示,后面有去深入理解的话,你用 byte 也不会省什么内存。」。
public class CalcValueLoss {
public static void main(String[] args) {
int intVal = 2000000000;
System.out.println(intVal + intVal);
/*1 int = 4 byte
* 1 byte = 8 bit
* 2^31 = 4294967296
* In [6]: 2 ** 31 > 2000000000 * 2
Out[6]: False
* int + int 得到的就是 int 无论你有没有溢出「int + long = long」
* */
}
}
对于,存款——你用 int 表示合不合适呢?
可能,就不是很合适了。有些人小目标很多,几百个小目标,就超出 int 表示的范围了。这个时候,你就要考虑,如果你做的事跟钱相关的东西的话,那你可以考虑用 long,或者用 double 。大家选择哪种数据类型的时候,要对它展示(存储)的数据要有一个大概的范围和预估。
5. 从数值计算溢出,理解程序员和编程语言责任的分界线
5.1 编程语言的作用
- 编程语言负责按照语法执行
- 编程语言负责和计算机交互
5.2 程序员的任务
- 程序员负责理解问题
- 程序员负责理解程序,并将问题转换为程序。「程序员是问题和程序的桥梁,编程语言是工具。」
- 编程语言不负责解决问题,程序员才负责解决问题
欢迎关注我公众号:AI悦创,有更多更好玩的等你发现!
公众号:AI悦创【二维码】
AI悦创·编程一对一
AI悦创·推出辅导班啦,包括「Python 语言辅导班、C++ 辅导班、java 辅导班、算法/数据结构辅导班、少儿编程、pygame 游戏开发」,全部都是一对一教学:一对一辅导 + 一对一答疑 + 布置作业 + 项目实践等。当然,还有线下线上摄影课程、Photoshop、Premiere 一对一教学、QQ、微信在线,随时响应!微信:Jiabcdefh
C++ 信息奥赛题解,长期更新!长期招收一对一中小学信息奥赛集训,莆田、厦门地区有机会线下上门,其他地区线上。微信:Jiabcdefh
方法一:QQ
方法二:微信:Jiabcdefh
你认为这篇文章怎么样?
- 0
- 0
- 0
- 0
- 0
- 0