【问题标题】:Is there a default type for numbers in JavaJava中是否有数字的默认类型
【发布时间】:2015-01-31 12:07:45
【问题描述】:

如果我写这样的东西

System.out.println(18);

哪种类型有“18”? 是 int 还是 byte? 还是它还没有类型?

它不能是 int,因为这样的东西是正确的:

byte b = 3;

这是不正确的:

int i = 3;
byte bb = i; //error!

编辑: 我想我在 Assignment Conversion 的规范中找到了正确的部分:

常量的编译时变窄意味着代码如:

byte theAnswer = 42;

是允许的。如果没有缩小范围,整数文字 42 具有 int 类型这一事实意味着需要强制转换为字节:

byte theAnswer = (byte) 42; // 强制转换是允许的,但不是必需的

【问题讨论】:

标签: java types numbers integer default


【解决方案1】:

这个

18

被称为integer literal。有各种literals、浮点、String、字符等。

接下来,

byte b = 3;

文字3 是一个整数文字。这也是一个不变的表达。由于 Java 可以判断 3 适合 byte,因此它可以安全地应用 narrowing primitive conversion 并将结果存储在 byte 变量中。

在这

int i = 3;
byte bb = i; //error!

文字3 是一个常量表达式,但变量i 不是。编译器只是确定i 不是一个常量表达式,因此不会特意找出它的值,转换为byte 可能会丢失信息(如何将12345 转换为byte ?),因此不应被允许。您可以通过将i 设为常量变量来覆盖此行为

final int i = 3;
byte bb = i; // no error!

或通过指定显式转换

int i = 3;
byte bb = (byte) i; // no error!

【讨论】:

    【解决方案2】:

    JLS-4.2.1 - Integral Types and Values

    整数类型的值是以下范围内的整数:

    • 对于 byte,从 -128 到 127(含)
    • 对于 short,从 -32768 到 32767(含)
    • 对于 int,从 -2147483648 到 2147483647(含)
    • 对于long,从-9223372036854775808 到 9223372036854775807,含
    • 对于char,从 '\u0000' 到 '\uffff' 包括在内,即从 0 到 65535

    还有JLS-3.10.1 - Integer Literals

    如果整数文字以 ASCII 字母 L 或 l (ell) 为后缀,则它是 long 类型;否则它是 int 类型(§4.2.1)。

    最后,JLS-3.10.2 - Floating-Point Literals 包括

    如果浮点字面量以 ASCII 字母 F 或 f 为后缀,则它的类型为 float;否则,它的类型是双精度的,并且可以选择以 ASCII 字母 D 或 d 为后缀(第 4.2.3 节)。

    对于byte b = 3;,它是从intbyteNarrowing Conversion

    【讨论】:

    • 因此,当您在 java 中键入任何数字(整数值)以将其设置为正确的 byte、short、int 或 long 数据类型(从 INT 执行缩小或扩大)时,编译器足够智能) 啊?有趣
    【解决方案3】:

    正如其他人所说,它是一个整数文字。

    在底层,Java 似乎是为 32 位处理器编写的。 一个整数介于 +/- ~214.7 万之间,即 2^31 与一个标志位。

    所以无论你是写一个位还是一个完整的 int,它都是一个单一的处理器函数,因此是一个单一的内存分配。

    【讨论】:

      猜你喜欢
      • 2012-09-14
      • 1970-01-01
      相关资源
      最近更新 更多