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
你看代码了吗?
#3
顶
#4
byte x='a'+8;//不会报错,why?'a'+8是什么型?
'a'是字符 也是ascii码 'a'=97
两个byte型数相加为int型这个跟+号有关
你写一个类重写+方法 在调用这个方法就知道了
两个int相加为int
两个float相加为float
'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));
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就是这么处理的,别太纠结了。
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中常量类型的判断原则也是“够用就行”,“不够用自动向更高字节类型转换”
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
你看代码了吗?
#3
顶
#4
byte x='a'+8;//不会报错,why?'a'+8是什么型?
'a'是字符 也是ascii码 'a'=97
两个byte型数相加为int型这个跟+号有关
你写一个类重写+方法 在调用这个方法就知道了
两个int相加为int
两个float相加为float
'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));
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就是这么处理的,别太纠结了。
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中常量类型的判断原则也是“够用就行”,“不够用自动向更高字节类型转换”
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中常量类型的判断原则也是“够用就行”,“不够用自动向更高字节类型转换”