jbu*_*jbu 91 java specifications numbers short long-integer
看来,当你在Java中输入一个数字时,编译器会自动将它读作一个整数,这就是为什么当你输入(long)6000000000
(不在整数范围内)时,它会抱怨它6000000000
不是一个整数.要纠正这个问题,我必须指明6000000000L
.我刚刚了解了这个规范.
还有其他数字规格,如short,byte,float,double?这似乎是好事,因为(我假设),如果你可以指定你输入的数字是短的,那么java就不必抛出它 - 这是一个假设,如果我错了,请纠正我.我通常会自己搜索这个问题,但我不知道甚至会调用这种数字规范.
Sim*_*son 168
long
(例如39832L
),float
(例如2.4f
)和double
(例如-7.832d
)存在特定的后缀.
如果没有后缀,并且它是整数类型(例如5623
),则假定为int
.如果它不是整数类型(例如3.14159
),则假定为a double
.
在其他情况下(byte
,short
,char
),你需要投,因为没有具体的后缀.
Java规范允许大写和小写后缀,但long
s 的大写版本是首选,因为大写L
不容易与数字混淆而1
不是小写l
.
有关血淋淋的细节,请参阅JLS第3.10节(参见定义IntegerTypeSuffix
).
eri*_*son 13
我希望你不会介意轻微的切线,但是你可能有兴趣知道除了F
(浮动),D
(对于双倍)和L
(长期),已经提出了一个建议来为byte
和short
- Y
和S
分别添加后缀.当使用字节(或短)数组的文字语法时,这将消除转换为字节的需要.引用提案中的示例:
主要好处:如果提案获得通过,为什么平台会更好?
肮脏的代码就像
Run Code Online (Sandbox Code Playgroud)byte[] stuff = { 0x00, 0x7F, (byte)0x80, (byte)0xFF};
可以重新编码为
Run Code Online (Sandbox Code Playgroud)byte[] ufum7 = { 0x00y, 0x7Fy, 0x80y, 0xFFy };
Joe Darcy正在监督Java 7的Project Coin,他的博客是跟踪这些提案的简单方法.
小智 8
默认情况下,java编译器将任何整数原始数据类型(byte,short,int,long)视为int类型.对于字节和短路,只要分配给它们的值在它们的范围内,就没有问题,也不需要后缀.如果分配给byte和short的值超出其范围,则需要显式类型转换.
例如:
byte b = 130; // CE: range is exceeding.
Run Code Online (Sandbox Code Playgroud)
克服这种执行型铸造.
byte b = (byte)130; //valid, but chances of losing data is there.
Run Code Online (Sandbox Code Playgroud)
在长数据类型的情况下,它可以毫无困难地接受整数值.假设我们分配了
Long l = 2147483647; //which is max value of int
Run Code Online (Sandbox Code Playgroud)
在这种情况下,不需要像L/l那样的后缀.默认值2147483647被java编译器认为是int类型.内部类型转换由编译器完成,int自动提升为Long类型.
Long l = 2147483648; //CE: value is treated as int but out of range
Run Code Online (Sandbox Code Playgroud)
这里我们需要将后缀作为L来将java文件2147483648视为long类型.
所以最后
Long l = 2147483648L;// works fine.
Run Code Online (Sandbox Code Playgroud)