【问题标题】:Converting long to int gives 0将 long 转换为 int 给出 0
【发布时间】:2015-03-01 23:34:37
【问题描述】:

我一直在用这个 sn-p 的代码进行测试:

public class Test {
    public static int longToInt(long num) {
        return (int) (num);
    }

    public static void main(String[] args) {
        System.out.println(longToInt(100000000L));
    }
}

我运行了它,但 longToInt 只返回 0。这是怎么回事?

【问题讨论】:

  • 无法重现:ideone.com/R4jZJ2
  • 如果您的long 值大于int 可以处理的值,您将得到int 溢出。
  • 什么版本的Java?当我运行你的代码时,我得到1215752192
  • 对我来说很好用
  • “Hello World”有用吗?

标签: java int type-conversion long-integer


【解决方案1】:

long 转换为int 是通过删除long 的前32 位来完成的。如果long 值大于Integer.MAX_VALUE (2147483647) 或小于Integer.MIN_VALUE (-2147483648),则最终结果是您丢失了重要位,结果是“垃圾”。


话虽如此,您提供的代码的行为并不像您所说的那样......如果您正确编译和运行它。原始版本应该打印一个意外的数字......但不是零。修改后的版本应该按预期打印 1000000。


...有没有办法可以将大于 Integer.MAX_VALUE 的长数字存储在 int 数字中?

没有。

嗯,严格来说是的……在某些情况下。你可以做一些事情来映射数字,例如,如果你知道你的数字总是在AB的范围内,并且B - A小于232,那么你可以通过从中减去A 来将该范围内的long 映射到int

但是,如果您在 long 中存储的数字域的大小大于 232,则在数学上不可能定义这样的映射。通常是这样。

【讨论】:

  • 我认为这是其他一些错误...话虽如此,有没有办法可以将大于 Integer.MAX_VALUE 的长数存储在 int 数中?
  • 我不会拨打这个号码意外
  • @ChristianHujer - OP 出乎意料。这个答案主要针对谁。 (我没有说“不可预测”或“随机”……这两者都是错误的!)
  • 您可以将 int 视为无符号,但您只能存储 2^32 个不同的值。
  • @StephenC 你是对的,已经得到了我的支持。只是说,一旦你知道发生了什么,这并不意外。出乎意料的是不一致、不合逻辑或错误的事情。但是你已经得到了我的支持,我现在只是在措辞上很迂腐,如果你愿意,你可以忽略它:)
【解决方案2】:

因为,你给的 long 不适合 int。给个小一点的长试试! 整数(32 位) 长(64 位)

【讨论】:

  • 实际上100000000L 确实适合int.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-13
  • 2020-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多