一篇博客搞定数据类型转换以及string类型转换

本文详细介绍了数据类型转换的概念,包括自动类型转换的逻辑,如从低内存类型向高内存类型转换的顺序,以及转换过程中计算机如何处理。同时,文章讨论了强制转换的细节和潜在风险,强调转换必须从小到大。此外,文章还探讨了String类型与其他基本类型之间的转换方法,包括parseInt和parseFloat等函数的使用,并提醒读者注意转换时的逻辑错误可能导致运行时异常。
摘要由CSDN通过智能技术生成

一篇文章搞懂数据类型转换以及string类型转换

本来上篇博客里留着的类型自动转换强制转换我一开始是打算写的,但是当时觉得单讲这个又有点少了,毕竟这两个转换,是什么有什么作用我觉得从字面意思就能感受到了。但是竟然有了承诺那就要做到,结果在二次学习中发现了不少细节,也加深了我对这个点的理解,拿出来分享给大家!!!
上一篇博客位置:[https://blog.csdn.net/m0_50302474/article/details/129797342?spm=1001.2014.3001.5502]

自动类型转换

类型的自动转换,其实就是从低内存的数据类型向着高内存的数据类型转换。

为什么会出现这种现象呢,两个数的相加如果数据类型不一样
按照我们人自己用笔计算的习惯来说。碰到一个两位数和一个个位数相乘的话,会把两个数的右边对齐,在进行计算。毕竟如果相乘的时候把个位数放在十位数计算的话,计算错误的出现也是理所当然的。
这里写一下自动类型转换的顺序

Char —>int —> long —> float —> double
Byte —> short —> int —> long —> float —> double

自动类型转换的计算机逻辑

而在前面一章里面提到了,计算机会根据不同的数据类型分配不同长度的空间。当计算机得知两个数的长度不一致的时候,他并没有那种从远处去观察两个数内存位置的能力,他只知道两个数长度不一样,无法进行计算的,只有长度一样的两个数才能计算。如何长度一样呢,那就是在数字的更高位去添加0,这样低位的数值还是在低位,高位的又都是0,数字大小并不会改变,这是唯一在不改变数大小的方式给数字增加长度的方法。如果是从低位开始加0的话,原来的地位数字就会变高而改变数的大小。就像01还是一但10就是十了。

添加0就必须要为它重新分配一个更大的空间,而这个更大的空间标准就是另一个和它计算数字的标准。统一了长度之后,计算机才会开始运算。
而前面讲的这一整套就是计算机自动类型转换的底层逻辑。
这里给出一个自动转换的代码大家可以自己运行验证一下
//创建类我就不写了

public static void main(String[] args) {
int num = ‘a’ ;
double d1 = 80 ;
System.out.println(num);//这里输出97,因为a字符对应的数字就是97,chat自动转换成int
System.out.println(d1);//这里输出80.0,因为int类型转换成了double,而浮点数是自带小数位的。这也是证明成功自动转换了。
}

同样如果你反过来写,就会报错,因为自动转换只能从小到大(大家可以根据我的上面写的自己敲出来试验一下。)

自动转换几个重点

1.精度大的赋值给成为精度小的就会报错,反之则进行自动类型转换。

2.当进行多种数据类型运算的时候,计算机会优先把所有数转换成其中最大的数据类型然后再进行计算

3.将一个数赋值给变量的时候,计算机会先判断这个数在不在数据类型的范围内,如果在则赋值,如果不在则报错。而如果将一个变量赋值给另一个变量那么计算机只会判断数据类型是否符合自动类型转换的标准。

4.short,byte,和char之间相互不会进行自动转换(规定就是如此)

5.short,byte和char之间计算会全部转换为int类型结果也会是int类型,所以只能用int类型接收。

byte num1 = 1;
byte num2 = 2;
byte num3 = num1 + num2;//这里会报错
int num4 = num1 + num2;//这个才是正确写法

6.布尔类型不参与类型的自动转换。

关于第三点 写点代码说明一下

正常情况下,一个常数赋值给一个byte类型

byte num1 = 26;
System.out.println(num1);//这里会输出26

而将一个int变量赋值给byte类型

int num1 = 26;
byte num2 = num1;//这里赋值就会报错,因为int比byte大,无法进行自动类型转换。即使26这个数字byte是可以装进去的。

强制转换

只有在理解了自动转换类型之后才能相对轻松的理解强制转换类型。因为自动转换是在前面更高位加0。

所以强制转换就是把高位的数字给他删了,来缩短数的内存空间。但是一旦删了1这样有明确大小的数,那么数据就会有损失

这也是强制转换存在的风险,也是我愿意花时间讲一讲的原因,因为如果只是知道强制转换别随便用或者强制转换有风险的话,这样的人并不算是一个合格的程序员。

总结一下强制转换类型的细节

1.将数据类型从大到小进行转换的时候就需要强制类型转换。

2.强转符号只对最近的操作数有效。

3.Char的类型可以保存常数,但是如果你赋值是int的变量,那就需要用到强转。

第二点进行一个代码说明

int num1 = (int)3.26 + 10.28;//这样他是会报错的因为前面的3.26被转换成了3但是后面的10.28并没有收到影响两个数相加的结果依旧需要用double类型接收。
int num2 = (int)(3.26 + 10.28);//这样他就会先进行加号运算,再将运算结果进行一个强制转换。

第三点进行一个代码说明

char c1 = 100//这个是可以输出的
int num1 =100char c2 = num1;//这个是会报错的
char c3 = (int)num1;//这个是可以输出的

String类型转换

讲完基本数据类型转换,顺带稍微提一下string类型和基本数据类型之间的转换。

由基本数据类型转换为string类型。

int n1 = 100;//对int使用转换和对byte以及short是一样的。
float n2 = 10.0f;
double n3 = 11.0;
boolean n4 = ture;
String s1 = n1 + “”;
String s2 = n2 + “”;
String s3 = n3 + “”;
String s4 = n4 + “”;
System.out.println(s1 + “ “ + s2 + “ “ + s3 + “ “ + s4);//这里加入” ”是为了让结果更好辨别。因为String的相加和相减都是直接拼接起来的。

由String转换为基本类型

String s5 =123;
int num1 = Integer.parseInt(s5);
double num2 = Double.parseDouble(s5);
float num3 = Float.parseFloat(s5);
long num4 = Long.parseLong(s5);
byte num5 = Byte.parseByte(s5);
short num6 = Short.parseShort(s5);
boolean num7 = Boolean.parseBoolean(true);

System.out.println(num1+1);//输出124
System.out.println(num2);//输出123.0
System.out.println(num3);//输出123.0
System.out.println(num4);//输出123
System.out.println(num5);//输出123
System.out.println(num6);//输出123
System.out.println(num7);//输出true
System.out.println(s5 + 1);//输出1231

这里为了做出区分在输出结果的地方补了一个加一来判断。因为String的特殊性质,给了加一之后他会拼接起来所以结果是1231,而正常的int类型加一就变成了124

String转换成char类型

//String转换成为char,只会取出其中一个字符。字符串的长度从0开始的,也就是说,123这个字符串1是第零位。
System.out.println(s5.charAt(0));输出1
System.out.println(s5.charAt(1));输出2
System.out.println(s5.charAt(2));输出3

提一个点

String转换为基本数据类型,需要转换的部分对于基本数据类型有意义。比如前面的123字符串转换为int,当然可以。但是yes这样一个字符串,是不能转换成为int。

这种语法上没有错误但是逻辑有错误,计算机会提示有异常。这个异常在编译的状态是不会报错的,只有在你运行的时候才会报错。并且会终止程序。

最后的最后

关于前面string转换那里代码里面的Interger以及parseInt,这些都是有严格的大小写区分类,方法的大小写写法以及类方法的引用需要什么包,这里埋个坑后面会讲。

评论,点赞,关注,支持一下!!!
(我会不定期回来看的,有评论问问题,或者提意见我都会看到)
(不知不觉写了快4000字,反复学习还是很有必要的!!)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值