JBTALKS.CC

标题: 纳闷 java long [打印本页]

作者: ~Zero    时间: 2009-12-22 02:57 PM
标题: 纳闷 java long
  1. long a = 24 * 60 * 60 * 1000;
  2. System.out.println(a);

  3. long b = 30 * a;
  4. System.out.println(b);

  5. long c = 30 * 24 * 60 * 60 * 1000;
  6. System.out.println(c);
复制代码


结果出来,
a = 86400000
b = 2592000000
c = -1702967296

害我 debug 了半天
作者: qweasdzxc    时间: 2009-12-22 03:34 PM
default is int value
但超过就会有负数

int  is 32bit     

     正确答案  
=========================
     long a = 24 * 60 * 60 * 1000;
      System.out.println(a);

      long b = 30 * a;
      System.out.println(b);
// 强硬转成long type
      long c = 30 * 24 * 60 * 60 * 1000l;
      System.out.println(c);
作者: 宅男-兜着走    时间: 2009-12-22 03:38 PM
标题: 回复 #1 ~Zero 的帖子
正数 X 整数 做么会出 负数?
paiseh 不要怪我肤浅,问这样的问题
作者: Super-Tomato    时间: 2009-12-22 03:42 PM
原帖由 ~Zero 于 2009-12-22 02:57 PM 发表
long a = 24 * 60 * 60 * 1000;
System.out.println(a);

long b = 30 * a;
System.out.println(b);

long c = 30 * 24 * 60 * 60 * 1000;
System.out.println(c);

结果出来,
a = 86400000
b = 259 ...



c 的 result 應該還沒超出 64bits 範圍, 為何會是負值?
那ㄇ你用看看 BigInteger 是否可以
作者: qweasdzxc    时间: 2009-12-22 03:50 PM
标题: 回复 #4 Super-Tomato 的帖子
c 的 result 還沒超出 64bits 範圍,  但是后面的30 * 24 * 60 * 60 * 1000 已经超出 32bits 範圍 。

java 内定是整数32bit的。

[ 本帖最后由 qweasdzxc 于 2009-12-22 03:54 PM 编辑 ]
作者: qweasdzxc    时间: 2009-12-22 03:53 PM
标题: 回复 #3 宅男-兜着走 的帖子
因为overflow 发生

32bit 的  最后一位bit是控制正负的。
作者: Super-Tomato    时间: 2009-12-22 03:55 PM
原帖由 qweasdzxc 于 2009-12-22 03:34 PM 发表
default is int value
但超过就会有负数

int  is 32bit     

     正确答案  
=========================
     long a = 24 * 60 * 60 * 1000;
      System.out.println(a);

      long b = 30  ...



並不是超過就會有負數, 而是需要看 bit 的變化, 真正的超出 datatype 範圍自然程式就會觸發 exception 事件或記憶體溢出而終止程式運行
作者: Super-Tomato    时间: 2009-12-22 03:57 PM
原帖由 qweasdzxc 于 2009-12-22 03:53 PM 发表
因为overflow 发生

32bit 的  最后一位bit是控制正负的。



沒錯, 第一位的 bit 是 signed 和 unsigned 的控制
作者: 宅男-兜着走    时间: 2009-12-22 03:57 PM
原帖由 qweasdzxc 于 2009-12-22 03:53 PM 发表
因为overflow 发生

32bit 的  最后一位bit是控制正负的。



overflow 的话不是 会终止program吗?
抱歉现在没 IDE 测试。
作者: Super-Tomato    时间: 2009-12-22 04:02 PM
原帖由 qweasdzxc 于 2009-12-22 03:53 PM 发表
因为overflow 发生

32bit 的  最后一位bit是控制正负的。



明白你的意思是說在 cache 中記憶體的演算
作者: qweasdzxc    时间: 2009-12-22 04:43 PM
这就是java的卖点了。

有保护的指针(pointer)
能有效的预防 overflow的问题

君不见,java从来没有发生 buffer overflow 问题嘛,  不像其他的语言。(C++ ,c ,   。net )
等等。
作者: 宅男-兜着走    时间: 2009-12-22 04:46 PM
标题: 回复 #11 qweasdzxc 的帖子
array overflow 就看过  经常中。




欢迎光临 JBTALKS.CC (https://jbtalks.my/) Powered by Discuz! X2.5