楼上说的不对。可以试一下。 class A {}classB{ A a = 10 }看它报的错就知道了。
同意heksn的意见,觉得这样可以节省内存(10占1Byte)。但就像qgdeng所说,如果如下程序: public class Test9{ public static void main(String[] args){ boolean b = 10; } } 则报错: found : int required: boolean boolean b = 10; ^ 1 error 可以看出10在java中似乎是int型的。 有哪位大虾是JVM权威来说说,java中具体是如何分配数字型常量内存的(String的问题已经有好多人说了)。
其实这里涉及到精度的问题:对于float f = 10.0; // error 这是因为会损失精度,所以报错。对于byte b = 10; // ok 这是因为byte的容量可以表示10这个数字,不会损失精度,所以正确。如果你写byte b = 128; 就会损失精度,编译会报错。明白了吗? 如果不明白,请举手!
thinking in java 第二版 侯捷 译 108 页 讲得很清楚。基本类型转型(除boolean,这个不能接受任何转型动作) 只要是宽化转换,就不需要明确指示。因为新型别能容纳来自是旧型别的信息,而不会遗失任何信息。只要有窄化转换时,编译器才会要求你强制转型。当然,class的型别不允许转型的。
int => float 就是宽化 float => int 就是窄化
int => byte 是宽化??????????????????????????这才是大家讨论的地方,请注意.
public class Test9{ public static void main(String[] args){ int a = 10; byte b = a; } }Test9.java:4: possible loss of precision found : int required: byte byte b = a; ^ 1 error public class Test9{ public static void main(String[] args){ byte b = 128; } }Test9.java:4: possible loss of precision found : int required: byte byte b = 128; ^ 1 errorpublic class Test9{ public static void main(String[] args){ byte b = 10; } }ok也就是说在编译的时候,编译器会自动对赋值进行检查,如果能够确定赋值不会造成精度损失,将自动进行类型转换;反之如果超出精度范围或者是进行变量赋值无法准确确定是否会造成精度损失的话,将通不过编译。
10缺省就是int,这和 int a = 10; 有何区别? byte b = a;////////
gyang的问题很好,我有程序:public class TypeTeset{ public static void main(){ int a = 10; byte b = a; } } 有如下错误: found : int required: byte byte b = a; ^ 那为什么 byte b = 10;就没错误呢?
看一下 byte b = 10;和byte b = (byte)10; 编译出来的class有什么不同就可以了。没试过,但是我认为是没有不同的。这个是编译期优化。也就是整形(64bit long除外)只要不越界,就自动转型。还有1.0和1.0f的区别也可以看出来java中整形默认类型100000%是int(错了自己给自己100000个耳光:P),大家可以试试 byte a = 10; byte b = 10; byte c = a + b; 的编译结果了。有人提到JVM,我不清楚,但是我想这个和CPU有关,java支持的CPU都是32位以上的吧,所以计算的时候,计算的过程都是用32bit进行的吧。 而且就上面的a+b是int类型的例子而言(其它short, char之间或者相互之间相加也是如此),因为他们相加可能会越界,因此使用了int, 而int之所以不管越界,就是因为32位cpu做int运算的电子电路只能出来两个正数相加等于负数的结果(最高位变1)。说错了,大家不要笑
在<java language Specification>中看到了说Integer literals的部分,不知是不是我们这的解。 另有问题: int i1 = 4000000000; //error!possible loss of precession int i2 = 0xffffffff; //success! 奇怪不?不知何解。
当数值超过32737才会默认为int.
大家商榷
任何数字的默认类型都是int.当你把它赋给short时,进行了转换。当数值溢出时会报错。
赋给long,隐士转换 当然没有问题了。
class A {}classB{
A a = 10
}看它报的错就知道了。
public class Test9{
public static void main(String[] args){
boolean b = 10;
}
}
则报错:
found : int
required: boolean
boolean b = 10;
^
1 error
可以看出10在java中似乎是int型的。
有哪位大虾是JVM权威来说说,java中具体是如何分配数字型常量内存的(String的问题已经有好多人说了)。
这是因为会损失精度,所以报错。对于byte b = 10; // ok
这是因为byte的容量可以表示10这个数字,不会损失精度,所以正确。如果你写byte b = 128; 就会损失精度,编译会报错。明白了吗?
如果不明白,请举手!
.两个数据类型是兼容的。
.目标数据类型比源类型大。
在此问题中还牵扯到了几个专业名词:宽类型转换和自动类型转换。
你是说byte和int兼容,所以可以把int类型的值10赋值给byte类型的变量吗。
另请问什么是宽类型转换,这个概念没听过,你说的是强制类型转换吗?
float => int 就是窄化
public static void main(String[] args){
int a = 10;
byte b = a;
}
}Test9.java:4: possible loss of precision
found : int
required: byte
byte b = a;
^
1 error
public class Test9{
public static void main(String[] args){
byte b = 128;
}
}Test9.java:4: possible loss of precision
found : int
required: byte
byte b = 128;
^
1 errorpublic class Test9{
public static void main(String[] args){
byte b = 10;
}
}ok也就是说在编译的时候,编译器会自动对赋值进行检查,如果能够确定赋值不会造成精度损失,将自动进行类型转换;反之如果超出精度范围或者是进行变量赋值无法准确确定是否会造成精度损失的话,将通不过编译。
byte b = a;////////
public static void main(){
int a = 10;
byte b = a;
}
}
有如下错误:
found : int
required: byte
byte b = a;
^
那为什么 byte b = 10;就没错误呢?
byte b = 10;和byte b = (byte)10;
编译出来的class有什么不同就可以了。没试过,但是我认为是没有不同的。这个是编译期优化。也就是整形(64bit long除外)只要不越界,就自动转型。还有1.0和1.0f的区别也可以看出来java中整形默认类型100000%是int(错了自己给自己100000个耳光:P),大家可以试试
byte a = 10;
byte b = 10;
byte c = a + b;
的编译结果了。有人提到JVM,我不清楚,但是我想这个和CPU有关,java支持的CPU都是32位以上的吧,所以计算的时候,计算的过程都是用32bit进行的吧。
而且就上面的a+b是int类型的例子而言(其它short, char之间或者相互之间相加也是如此),因为他们相加可能会越界,因此使用了int, 而int之所以不管越界,就是因为32位cpu做int运算的电子电路只能出来两个正数相加等于负数的结果(最高位变1)。说错了,大家不要笑
byte b2=1+1;
byte b3=b1+1;
byte b4=b1++;int i1=Integer.MAX_VALUE+1; //Integer.MAX_VALUE=2147483647
int i2=2147483648;
把byte改为char和short几乎是一样的。
因为整数字面常量是int型的,也就是1和2都是int型的
在赋值语句中直接把一个int型赋给byte肯定是不行的。
int i=1;
byte b=i;
是编译不过的,因为隐性类型转换不允许,改为下面的就可以了
int i=1;
byte b=(byte)i;隐性转换一般都是放宽转换(如byte到int,String到Object)
但是却有一个例外就是,在赋值转换中,
隐性转换也包含了缩窄基本转换。就是从int到byte,char,short的转换:
比如:
byte b=1;//合法
byte b=128; //非法右边必须为int型字面常量,而且值必须能被左边类型表示
但是却有一个例外就是,在赋值转换中,
隐性转换也包含了缩窄基本转换。就是从int到byte,char,short的转换:
比如:
byte b=1;//合法
byte b=128; //非法右边必须为int型字面常量,而且值必须能被左边类型表示----------------------------------------------
请问,在哪些规范或书籍上有文字记载,谢谢.
或者能引经据典,或者可以在java编译器的处理或JVM内存分配上明确说明。
否则,都很难说就是这样的。
另有问题:
int i1 = 4000000000; //error!possible loss of precession
int i2 = 0xffffffff; //success!
奇怪不?不知何解。