class LongTest
{
public static void main(String[] args)
{
Long l=1;
System.out.println("Hello World!");
}
}
报错信息:
E:\code\java>javac LongTest.java
LongTest.java:5: 错误: 不兼容的类型
Long l=1;
^
需要: Long
找到: int
1 个错误最近在看JAVA基础,其实上面说得很清楚了,整数型默认是int,long型值后面要加上l或L,java才会把它当long
但是我现在声明的变量就是一个long型的,这还不清楚吗?
为什么非要在值后面加l?longint默认
找到: int它在哪里找的int?
不是说主数据类型变量的值,直接是个二进制存吗?
难道在Long l=1;的时候放入的是一下4个字节的二进制码?
Java区分大小写,Long和long是两个不同的类型
你的程序中应该把Long改为long
long l=1;
java编译器会自动装箱。
这两个对象的类型不匹配。
包装类的自动装箱与拆箱只能与对应的基本类型之间,基本类型之间要人工转型,你的改为Long l=1l;或者Long l=(long)1;就可以了。1默认为int型,1l才是long型。
多看看书再问吧,再有问题可以继续问
LongTest.java:5: 错误: 过大的整数: 4000000000
long l=4000000000;
^
所以还是回到最开始的时候,为什么它要说4000000000过大?我把程序改成long l=4000000000l;就通过编译了
因为1是int,不回auto-box成Long;1L才是long,可以auto-box成Long。
但是还非要在值后面加个L标明是长整型
java是怎么弄的?主数据变量的值是直接存的字节啊~~!
难道默认存的4个字节?
JAVA通过值的大小来确定变量的大小?
omg,那声明的时候数据类型不是个摆设吗?坑爹的玩意
4000000000是整型,只有在4000000000后加l或L(4000000000l或4000000000L)编译器才会把它当长整型处理,
long l=4000000000;
此语句可解析为把整型4000000000赋值给长整型l,而4000000000超出了int的取值范围,所以报错
但是Short s = 1;这个可以通过编译
为什么JAVA没把1也当整型呢?
此语句可解析为把整型1赋值给短整型s,而1既在int的取值范围,也在Short的取值范围,所以不报错
感觉这种解释还是不对因为float f=1.1;报错:
E:\code\java>javac FloatTest.java
FloatTest.java:5: 错误: 可能损失精度
float f=1.1;
^
需要: float
找到: double
1 个错误如果按你的解释的话,就是将双精度1.1赋值给单精度f,而1.1即在双精度的取值范围,又在单精度的取值范围,但是此例还是报错,说明JAVA不是那样做的
float f=(float)1.1;
而短整型转整型不用考虑精度问题,所以:short s = 1;等同于short s = (short)1;
但如果int类型的值超出short类型,还是需要进行强制转换的,如:
short s = (short)1;
float f=(float)1.1;
而短整型转整型不用考虑精度问题,所以:short s = 1;等同于short s = (short)1;
但如果int类型的值超出short类型,还是需要进行强制转换的,如:
short s =32768;(报错)
short s = (short)32768;(不报错)
但这是s的值为-32768
感觉这种解释还是不对因为float f=1.1;报错:
E:\code\java>javac FloatTest.java
FloatTest.java:5: 错误: 可能损失精度
float f=1.1;
^
需要: float
找到: double
1 个错误如果按你的解释的话,就是将双精度1.1赋值给单精度f,而1.1即在双精度的取值范围,又在单精度的取值范围,但是此例还是报错,说明JAVA不是那样做的 s=1
System.out.println(1.1 == 1.0999999999999999999);
将会输出true至于Short s = 1; 这个情况,我觉得可能是一种语法糖。因为我网上找到的所有资料无一例外都是说需要(short)的转换。我想可能是编译器在看到这个值的取值范围在short之内时,就自动转换成short了。但是默认的整型类型,仍然是int,所以不能自动装箱成Long
不对,short s = 1;这个例子是整型转短整型,四个字节转两个字节,没有报错
但是,float f=1.1;这个例子是双精度转单精度,八个字节转四个字节,同样是高转低,但报错了,为啥子
你举的short s =32768;(报错)这个例子属于超过取值范围的问题了,先不讨论这个
系统知道哦,你看它报得错:
报错:
E:\code\java>javac FloatTest.java
FloatTest.java:5: 错误: 可能损失精度
float f=1.1;
^
需要: float
找到: double
1 个错误
浮点型赋值的时候,java默认是双精度,所以报错上面说,找到double,需要float
它为什么不像short s=1;的时候那样,自动判断一下呢?