【问题标题】:Java's L number (long) specificationJava 的 L 号(长)规范
【发布时间】:2010-10-20 16:13:39
【问题描述】:

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

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

【问题讨论】:

    标签: java numbers long-integer short specifications


    【解决方案1】:

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

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

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

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

    请参阅JLS section 3.10 了解详细信息(请参阅IntegerTypeSuffix 的定义)。

    【讨论】:

    • 迟到:消除潜在的歧义来源总是好的,我不反对...但我相信如果你发现自己混淆了 1 和 @987654341 @ 和 0O(等等),您的 优先级 是正确设置字体(如果可以的话),然后担心确保不会错过 Shift 键。
    • @SimonNickerson 我对后缀有疑问...如果我声明一个 longdouble 变量,例如:long _lo = 30; 而不是 @ 987654345@ 这是否意味着我的变量将被转换为 float ?或者在 _lo = _lo + 2.77 的情况下,_lo 将被转换为 float 尽管它被声明为 long
    • 不,这里不涉及浮点数。在第一种情况下,30 是一个int,它通过扩大转换自动转换为long。在第二种情况下,您的陈述是非法的。您必须明确地将右手边转换为长,例如_lo = (long) (_lo + 2.77)
    • @DavidCesarino 更改字体会为您解决歧义 - 在您设置正确的特定编辑器中。当您在不同的编辑器、IDE 中阅读代码、查看网络上的源代码(审查工具、存储库、等等..)。恕我直言,当务之急是不要错过 Shift 键。顺便提一句。你推荐什么字体?我喜欢等宽字体,它几乎是我见过的所有编辑器、CLI 等的默认字体,并且在这种字体中 l10O resp.)非常相似。
    • @dingalapadum 正如我所说,你是对的。消除歧义的来源绝对是正确的做法。我只是说你应该尽量不要使用任何容易出错的编辑器。换句话说,防御性编码的旧建议,但不依赖于它。关于字体,它非常个人化,但我总是尽可能使用 Deja Vu Sans Mono,因为 1)它是等宽的; 2)字符之间没有歧义; 3)我喜欢它的形状,漂亮而优雅,几乎就像一个好的、可读的无衬线字体(其他好的编程字体感觉太“金属”恕我直言)。
    【解决方案2】:

    默认情况下,任何整型原始数据类型(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.
    

    如果是长数据类型,它可以轻松接受整数值。假设我们分配like

    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.
    

    【讨论】:

      【解决方案3】:

      我希望你不会介意一点切线,但我想你可能有兴趣知道除了F(用于浮点)、D(用于双精度)和L(用于长)之外,@ 987654321@分别为byteshort添加后缀—YS。当使用字节(或短)数组的文字语法时,这将消除转换为字节的需要。引用提案中的示例:

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

      类似的代码

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

      可以重新编码为

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

      Joe Darcy 正在监督 Java 7 的 Project Coin,his blog 是跟踪这些提案的简便方法。

      【讨论】:

      • 那太好了...我一直觉得所有的演员都很烦人
      • 我认为它没有进入 Java 7。关于它是否会进入未来更新或 Java 8 的任何消息?
      • @crush 几个月前我尝试过调查,据我所知,该提案已被放弃。我们确实得到了数字文字中的 _ 和二进制文字的 0b 前缀。哎呀。
      • 这个提案可能是在 kotlin 而不是 java 上实现的,因为 oracle 不希望社区告诉他们如何工作......我们在 2018 年,但遗憾的是,这个提案仍然没有任何内容跨度>
      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        看起来这些会很好 有因为(我假设)如果可以的话 指定您输入的数字是 一个短然后java就不必了 投射它

        由于文字的解析发生在编译时,这与性能完全无关。拥有shortbyte 后缀的唯一原因是它可以使代码更紧凑。

        【讨论】:

          【解决方案6】:

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

          long l = -1 >>> 1;
          

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

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

          -1L >>> 1 // ?
          

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

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

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

          【讨论】:

          • 我真的很想知道你过去的意思。在这两种情况下,我都会得到 2147483647,但我不明白为什么我应该期待别的东西。
          • @TheincredibleJan 你理所当然地期望Integer.MAX_VALUE,但是如果没有办法区分intlong 字面量,那将是模棱两可的。 /我不记得这个问题,但无论如何我已经澄清了我的答案。
          【解决方案7】:

          Java 有两种数据类型:

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

          某些数据类型需要诸如 long、float 和 double 等规范。

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

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

          例子:

          长数 = 15000000000L;

          float mysecondnum = 5.75f;

          双倍我的号码 = 19.99d;

          更多信息:

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

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

          编辑:

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

          • 加宽铸件(自动):从小字体到大字体
          • 窄铸件(手动):较大型到较小型

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-09-20
            • 1970-01-01
            • 1970-01-01
            • 2023-03-21
            • 2015-07-22
            • 1970-01-01
            相关资源
            最近更新 更多