byte c = 2*2*2*2*2*2*2-1;
short d =2*2*2*2*2*2*2*2*2*2*2*2*2*2*2-1 ;
int e = 2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2-1;
long f=(long)2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2-1;
long g = Long.MAX_VALUE;  
  System.out.println(c);
  System.out.println(d);
  System.out.println(e);
  System.out.println(f);
  System.out.println(g);遇到这样几个问题:
1. byte、short 在定义的时候如果超出范围就会直接报错,但int、long如果超出范围,写的时候不会报错,运行结果为-1,这是为什么呢;
2.第一个long最大值算法必须要加(long),否则结果也是-1,这里为什么要有强转,如果java默认数据类型是int,那也算是向上转型,应该不需要强转才对。知道的请说下,谢谢了。

解决方案 »

  1.   

    这跟越界没关系
    而是系统自动把超出byte,short范围的数值(数字)自动转换为int类型,所以你要赋值就要强行转换byte b1 = 5; //合法
    byte b2 = 300; //非法,因为系统自动把300当作int来处理,所以要强行转换,即
    byte b3 = (byte)300; //要这样转换
      

  2.   


    那long最大值的计算是系统先自动认为是int  才需要强转的么
      

  3.   

    -1向上转型,是带符号位上转的(除了char,因为char是无符号类型的)
    比如
    byte b1 = (byte)128; //结果是-128, 二进制10000000
    short s1 = (short)b1; //s1也是-128
    LZ可能会觉得short应该是128,二进制应该是00000000 10000000,但是实际上是 11111111 10000000,即符号位向上扩展
    所以,第二个long没有强行转换,系统自动把越界的int带符号位向上转型,所以结果也是负的
    而第一个long,因为强行把第一个2转换为long,所以后面的结果都按long类型来计算(系统自动转换为最高类型运算)
      

  4.   

    上面说错了,第二个long改成第一个long,

    第一个long没有强行转换,系统自动把越界的int带符号位向上转型,所以结果也是负的
    而如果强行转换,因为先把第一个2转换为long,所以后面的结果都按long类型来计算(系统自动转换为最高类型运算)
      

  5.   

    大范围数 可以定义为BigDecimal类型
      

  6.   


    那您的那两句,我可不可以这么理解:
    128被默认成是int 强转成byte,因为不在范围,丢失精度变成-128了
    -128强转成short,但在范围内所以还是-128那么第一个long最大值的计算就很容易理解了
    long a = (long)2的63次方-1;   结果是正确的
    long b = (long)(2的63次方-1); 结果肯定是-1终于想明白了数据类型转换了,而且java默认的数据类型是int
      

  7.   

    是的,java默认的数值是int类型的
    至于(long)2的63次方,因为是先把第一个2转成long类型,而java的运算是以最高类型优先,所以后面的运算都转成long型来计算,所以结果没问题
    LZ可以好好体会一下的结果long l1 = Integer.MAX_VALUE + 1; //把int结果自动向上转型,带符号位转型
    long l2 = (long)Integer_MAX_VALUE + 1; //先把Integer.MAX_VALUE转成long,后面的运算都是long类型运算,所以没有超出long的范围
    long l3 = (long)(Integer.MAX_VALUE + 1); //把int计算结果转成long,和l1的效果一样