105

看来,当您在 Java 中输入数字时,编译器会自动将其读取为整数,这就是为什么当您输入 (long) 6000000000(不在整数范围内)时,它会抱怨6000000000不是整数。为了纠正这个问题,我必须指定6000000000L. 我刚刚了解了这个规范。

是否有其他数字规范,例如短、字节、浮点、双精度?拥有这些似乎很好,因为(我假设)如果您可以指定您输入的数字是一个短数字,那么 java 就不必强制转换它 - 这是一个假设,如果我错了,请纠正我. 我通常会自己搜索这个问题,但我什至不知道这种数字规范叫什么。

4

7 回答 7

192

long(eg 39832L)、float(eg 2.4f) 和double(eg )有特定的后缀-7.832d

如果没有后缀,并且是整数类型(例如5623),则假定为int. 如果它不是整数类型(例如3.14159),则假定它是 a double

在所有其他情况下(byte, short, char),您需要强制转换,因为没有特定的后缀。

Java 规范允许使用大写和小写后缀,但long首选 s 的大写版本,因为大写比小写L更不容易与数字混淆。1l

有关血腥细节,请参阅JLS 第 3.10 节(请参阅 的定义IntegerTypeSuffix)。

于 2009-04-20T20:45:24.013 回答
15

默认情况下,任何完整的原始数据类型(byte、short、int、long)都将被java 编译器视为int类型。对于byteshort,只要分配给它们的值在它们的范围内,就没有问题,也不需要后缀。如果分配给byteshort的值超出了它们的范围,则需要显式类型转换。

前任:

byte b = 130; // CE: range is exceeding.

克服这个执行类型转换。

byte b = (byte)130; //valid, but chances of losing data is there.

在长数据类型的情况下,它可以毫不费力地接受整数值。假设我们分配喜欢

long l = 2147483647; //which is max value of int

在这种情况下,不需要像 L/l 这样的后缀。默认值 2147483647 被 java 编译器认为是 int 类型。内部类型转换由编译器完成,int 自动提升为 Long 类型。

long l = 2147483648; //CE: value is treated as int but out of range 

这里我们需要把后缀写成 L 来让 java 编译器把字面量 2147483648 当作 long 类型。

所以最后

long l = 2147483648L;// works fine.
于 2017-03-18T12:58:30.470 回答
13

我希望你不会介意一点切线,但我想你可能有兴趣知道除了F(for float)、D(for double) 和L(for long) 之外,还提出了分别为byteand 和short-Y和添加后缀的提议S. 当使用字节(或短)数组的文字语法时,这将消除转换为字节的需要。引用提案中的示例:

主要好处:如果提案被采纳,为什么平台会更好?

像粗鲁的代码

 byte[] stuff = { 0x00, 0x7F, (byte)0x80,  (byte)0xFF};

可以重新编码为

 byte[] ufum7 = { 0x00y, 0x7Fy, 0x80y, 0xFFy };

Joe Darcy 正在监督 Java 7 的 Project Coin,他的博客是跟踪这些提案的一种简单方法。

于 2009-04-20T20:45:51.110 回答
9

这些是文字,在 Java 语言规范的第 3.10 节中进行了描述。

于 2009-04-20T20:41:45.833 回答
1

拥有这些似乎很好,因为(我假设)如果您可以指定您输入的数字是一个短数字,那么 java 就不必强制转换它

由于文字的解析发生在编译时,这与性能完全无关。short拥有和byte后缀会很好的唯一原因是它会导致更紧凑的代码。

于 2009-04-21T08:17:27.750 回答
1

Java有两种数据类型:

  1. 原始数据类型
  2. 非原始数据类型

某些数据类型需要像 long、float 和 double 这样的规范。

在将上述任何数据类型分配给任何变量时,请始终记住......

  • 以双精度数据类型的“d”结束值。
  • 在长数据类型中以“L”结束值。
  • 以浮点数据类型的“f”结束值。

例子:

长数 = 15000000000L;

浮动 mysecondnum = 5.75f;

双倍我的号码 = 19.99d;

更多信息:

  • long 数据类型的大小为 8 个字节。
  • float 数据类型的大小为 4 个字节。
  • 双精度数据类型的大小为 8 个字节。

long 数据类型的精度级别最高为 7-8 位小数,而 float 数据类型最高为 15 位小数。

编辑:

与这种类型转换一起,可用于将原始数据类型从一种更改为另一种。

  • 加宽铸造(自动):较小的类型到较大的类型尺寸
  • 窄型铸造(手动):较大型到较小型
于 2021-05-13T08:24:37.307 回答
0

要理解为什么有必要区分intlong文字,请考虑:

long l = -1 >>> 1;

相对

int a = -1;
long l = a >>> 1;

现在,正如您所期望的那样,两个代码片段都为 variable 赋予了相同的值l。无法区分intlong字面意思,解释是-1 >>> 1什么?

-1L >>> 1 // ?

或者

(int)-1 >>> 1 // ?

所以即使数字在公共范围内,我们也需要指定类型。如果默认值随着字面量的大小而改变,那么仅仅改变数字就会对表达式的解释产生奇怪的变化。

这不会发生byteshort并且char因为它们总是在执行算术和按位运算之前被提升。可以说它们应该是用于数组初始化表达式的整数类型后缀,但没有。float使用后缀fand double d。其他文字有明确的类型,有一个特殊的类型null

于 2009-04-20T20:38:37.260 回答