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 。