Java的L数(长)规范
看起来,当你在Java中键入一个数字时,编译器会自动把它作为一个整数来读取,这就是为什么当你input(long)6000000000(不在整数范围内)时,会抱怨说6000000000不是一个整数。 为了纠正这个问题,我不得不指定6亿次。 我刚刚了解了这个规范。
有其他的数字规格,如短,字节,浮点数,双? 这似乎是好的,因为(我认为),如果你可以指定你input的数字是一个简短的,那么Java不必投它 – 这是一个假设,纠正我,如果我错了。 我通常会自己search这个问题,但是我不知道这种数字规范甚至被称为什么。
long
(如39832L
), float
(例如2.4f
)和double
float
(例如2.4f
)有特定的后缀。
如果没有后缀,并且是一个整数types(例如5623
),则假定它是一个int
。 如果它不是一个整数types(例如3.14159
),则假定它是一个double
3.14159
型。
在所有其他情况下( byte
, short
, char
),你需要演员,因为没有特定的后缀。
Java规范允许大写和小写后缀,但大写字母版本long
字符是首选的,因为大写字母L
与小写字母l
不易与数字1
混淆。
有关详细信息,请参阅JLS第3.10节 (请参阅IntegerTypeSuffix
的定义)。
我希望你不会介意有一点切线,但是你可能有兴趣知道除了F
(用于float), D
(用于double)和L
(用于long)之外, 还有一个build议是为byte
添加后缀和short
– Y
和S
分别。 这将消除在使用byte(或short)数组的文字语法时需要转换为字节的需要。 从提案中引用例子:
主要收益:如果提案被采纳,为什么平台更好?
cruddy代码像
byte[] stuff = { 0x00, 0x7F, (byte)0x80, (byte)0xFF};
可以被重新编码为
byte[] ufum7 = { 0x00y, 0x7Fy, 0x80y, 0xFFy };
Joe Darcy正在监督Java 7的Project Coin, 他的博客是追踪这些提议的简单方法。
这些是文字,在Java语言规范的第3.10节中有描述。
默认情况下,Java编译器会将任何整数基本数据types(byte,short,int,long)视为inttypes。 对于字节和短 ,只要分配给它们的值在它们的范围内,没有问题,并且不需要后缀。 如果分配给byte和short的值超出了范围,则需要显式types转换。
例如:
byte b = 130; // CE: range is exceeding.
克服这种执行型铸造。
byte b = (byte)130; //valid, but chances of losing data is there.
在数据types较长的情况下,可以毫不费力地接受整数值。 假设我们分配像
Long l = 2147483647; //which is max value of int
在这种情况下,不需要像L / l那样的后缀。 java编译器默认值2147483647是inttypes。 内部types转换由编译器完成,int被自动提升为Longtypes。
Long l = 2147483648; //CE: value is treated as int but out of range
在这里,我们需要把后缀L作为长时间的java编译器对待2147483648。
最后
Long l = 2147483648L;// works fine.
这似乎是这样会很好,因为(我假设),如果你可以指定你input的数字是一个简短的,那么Java不必投它
由于文字的parsing发生在编译时,这在性能方面是绝对不相关的。 有short
和byte
后缀的唯一原因将是很好的是,它导致更紧凑的代码。
考虑:
long l = -1 >>> 1;
与
int a = -1; long l = a >>> 1;
现在你会期望麻烦的代码段给variablesl
赋予相同的值。 所以我们需要在int
文字上expression为int
。