A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 吴小东 于 2012-6-10 00:19 编辑

第一个问题是  为什么我定义长整型b 会报错过大的整数
第二个问题是  如果定义的整型超过了长整型-2的63次方  到 2的63-1次方 该如何定义
  1. public static void main(String[] args)
  2.         {
  3.                 //long b = 512230173432;
  4.                 //long b = new Long(512230173432);//此处会报错   Test.java:9: 过大的整数: 512230173432
  5.                 long a = 1;//定义2的0次方
  6.                 for (int i = 1; i<100;i++ )
  7.                 {
  8.                         a = a*2;
  9.                         if (i>=60)
  10.                         {
  11.                                 System.out.println("2的"+i+"次方为: "+a);        //打印出以下值
  12.                 //2的60次方为: 1152921504606846976
  13.                                 //2的61次方为: 2305843009213693952
  14.                                //2的62次方为: 4611686018427387904
  15.                               //2的63次方为: -9223372036854775808
  16.                         }
  17.                         if (a<=0)
  18.                         {
  19.                                 break;
  20.                         }
  21.                 }
  22.         }
复制代码
论坛菜鸟,第一次发帖,请大虾们多多指教;P

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

6 个回复

倒序浏览
可使用BigDecimal类 BigDecimal由任意精度的整数非标度值 和 32 位的整数标度 (scale) 组成
回复 使用道具 举报
本帖最后由 赵兵锋 于 2012-6-9 13:13 编辑
  1. public static void main(String[] args){
  2.                                                                 long b = 512230173432L;//右边的表达式没有L的时候,表达式结果是int型,装不下,所以会报错。加上L,右边的表达式为long型,就装下了。
  3.                 long c = new Long(512230173432L);//同样,这里加上L,就行了。
  4.                 System.out.println("Max Value: "+Long.MAX_VALUE);
  5.                 long a = 1;//定义2的0次方
  6.                 for (int i = 1; i<65;i++ )
  7.                 {
  8.                                                 if(i==63){
  9.                                                         a = a*2-1;//Long的最大值为2^63-1;超过会溢出。
  10.                                                 }else{
  11.                                 a = a*2L;
  12.                               }
  13.                         if (i>=60)
  14.                         {
  15.                                 System.out.println("2的"+i+"次方为: "+a);
  16.                         }
  17.                         if (a<=0)
  18.                         {
  19.                                 break;
  20.                         }
  21.                 }
  22.         }
  23. 输出:
  24. Max Value: 9223372036854775807
  25. 2的60次方为: 1152921504606846976
  26. 2的61次方为: 2305843009213693952
  27. 2的62次方为: 4611686018427387904
  28. 2的63次方为: 9223372036854775807
  29. 2的64次方为: -2
复制代码
回复 使用道具 举报
赵兵锋 发表于 2012-6-9 13:12

难得自动装箱 拆箱 不适合long类型的数据吗? 我在下面的循环里面定义的long a  = 1 ;循环过程中不加 L 它为什么也能自动提升了数据类型。
回复 使用道具 举报
这是因为不同类型数据在做运算时,char、byte、int都会被先转成int再参与运算,运算结果也是int,若有long类型数据参与了运算,那么都会被转成long类型来运算,最后表达式结果也会是long。你定义的a是long类型的,在下面的a=a*2;里,一个long类型与int类型在做运算,2会被转为long类型,然后运算,表达是结果也会是long。
同理,若有float参与运算,都会被当作float运算,表达式结果也是float;若有double参与运算,同理。

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

回复 使用道具 举报
第一个问题是  为什么我定义长整型b 会报错过大的整数
    long b = new Long(512230173432);    //512230173432这个是int型;应该512230173432L
第二个问题是  如果定义的整型超过了长整型-2的63次方  到 2的63-1次方 该如何定义
    BigDecimal对象,可以和基本数据类型转换。

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

回复 使用道具 举报
懂了,多谢各位大侠指点
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马