Java的类型转换问题,纠结啊~~~~~~~~

时间:2022-01-20 17:49:51
我又试了下,代码是这样的:

public class Test {
public static void main(String[] args){
byte x='a'+8;//不会报错,why?'a'+8是什么型?

byte y=8;
//byte z=y+8;去掉注释会报错,因为y+8是int型
}
}

Java只对变量自动转换类型,而不对常量自动转换类型?也不对呀,'a'是2字节常量,x是1字节变量,怎么可以直接赋值?

14 个解决方案

#1


char c = 'a'+9;
System.out.println(c);

你会明白的

#2


引用 1 楼 zhouyuqwert 的回复:
Java code
char c = 'a'+9;
System.out.println(c);

你会明白的

你看代码了吗?

#3


引用 1 楼 zhouyuqwert 的回复:
Java code
char c = 'a'+9;
System.out.println(c);

你会明白的

#4


 byte x='a'+8;//不会报错,why?'a'+8是什么型?

'a'是字符  也是ascii码   'a'=97 



两个byte型数相加为int型这个跟+号有关  

你写一个类重写+方法  在调用这个方法就知道了
两个int相加为int
两个float相加为float

#5


格式和存储,可能搞混了吧两个概念

#6


ASCII 码

#7


我忽然想起了
System.out.println("1+1="+1+1);
System.out.println("1+1="+(1+1));

#8


请参考以下代码:
float i=100.0;//报错
float i=100.0f;//正解

#9


    报告楼主,我用你的方法试了下,编译器不报错,能运行。

#10


关于常量的运算会被java优化,在编译期间就提前运算,那样也就相当于直接写了个运算结果,所以是不会报错的。如果是变量和常量之间的运算,java就会需要考虑数据类型。

#11


如果说'a'是ASCII码的确说的通,但Java用的是Unicode码吧,我问的是Java又不是C++

#12


去弄一本java基础看看吧

#13


int是32位;
char是16位;
byte是8位;
char字符的,是asicll值时不超过byte表示范围,在编译时期用byte值都不报错。
不然就会报错,
byte x = '中'+8;肯定报错;
Java就是这么处理的,别太纠结了。

#14


自己来宣布正确答案:
Java中,

字符常量有两种类型:ASCII型和Unicode型,常量具体是那种类型由范围决定,原则是够用就行:如'a'是ASCII型,'中'是Unicode型。'a'+6是ASCII型,'a'+60是Unicode型(隐含有自动类型转换)。

字符变量一定是Unicode型。

所以,像char x='a';这种语句会有一个自动类型转换,把ASCII型的'a'转换成Unicode型的'a',再赋给变量x。


且Java中,

byte型变量运算时会转换成int型
byte型常量如4,123运算时不会自动转换,而456,345这些常量不是byte型常量,而是short型常量,Java中常量类型的判断原则也是“够用就行”,“不够用自动向更高字节类型转换”

#1


char c = 'a'+9;
System.out.println(c);

你会明白的

#2


引用 1 楼 zhouyuqwert 的回复:
Java code
char c = 'a'+9;
System.out.println(c);

你会明白的

你看代码了吗?

#3


引用 1 楼 zhouyuqwert 的回复:
Java code
char c = 'a'+9;
System.out.println(c);

你会明白的

#4


 byte x='a'+8;//不会报错,why?'a'+8是什么型?

'a'是字符  也是ascii码   'a'=97 



两个byte型数相加为int型这个跟+号有关  

你写一个类重写+方法  在调用这个方法就知道了
两个int相加为int
两个float相加为float

#5


格式和存储,可能搞混了吧两个概念

#6


ASCII 码

#7


我忽然想起了
System.out.println("1+1="+1+1);
System.out.println("1+1="+(1+1));

#8


请参考以下代码:
float i=100.0;//报错
float i=100.0f;//正解

#9


    报告楼主,我用你的方法试了下,编译器不报错,能运行。

#10


关于常量的运算会被java优化,在编译期间就提前运算,那样也就相当于直接写了个运算结果,所以是不会报错的。如果是变量和常量之间的运算,java就会需要考虑数据类型。

#11


如果说'a'是ASCII码的确说的通,但Java用的是Unicode码吧,我问的是Java又不是C++

#12


去弄一本java基础看看吧

#13


int是32位;
char是16位;
byte是8位;
char字符的,是asicll值时不超过byte表示范围,在编译时期用byte值都不报错。
不然就会报错,
byte x = '中'+8;肯定报错;
Java就是这么处理的,别太纠结了。

#14


自己来宣布正确答案:
Java中,

字符常量有两种类型:ASCII型和Unicode型,常量具体是那种类型由范围决定,原则是够用就行:如'a'是ASCII型,'中'是Unicode型。'a'+6是ASCII型,'a'+60是Unicode型(隐含有自动类型转换)。

字符变量一定是Unicode型。

所以,像char x='a';这种语句会有一个自动类型转换,把ASCII型的'a'转换成Unicode型的'a',再赋给变量x。


且Java中,

byte型变量运算时会转换成int型
byte型常量如4,123运算时不会自动转换,而456,345这些常量不是byte型常量,而是short型常量,Java中常量类型的判断原则也是“够用就行”,“不够用自动向更高字节类型转换”