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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 隋玉翠 黑马帝   /  2011-8-5 11:36  /  2551 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

long g=10000;
long g1=10000L;
试问如上定义变量g与g1的区别?

4 个回复

倒序浏览
黑马网友  发表于 2011-8-5 12:00:35
沙发
这个问题,我在电脑上实验过了,打印的结果一样,呵呵,我自己推测是不是java会自动转换,反正定义的是long型的加不加只是个形式。
回复 使用道具 举报
long g 是在栈内存中生成一个名叫g的长整型变量名,
= 右边是在堆内存中生成实际的数据,
例如:
long gl= 1000000000000L;//编译通过
long g = 1000000000000;//编译不通过,因为给此=号右边分配堆内存时是按照int型的大小进行的分配,超出范围了。
回复 使用道具 举报
黑马网友  发表于 2011-8-5 14:00:03
板凳
这是数据类型的自动提升啊,int类型的数据会自动提升为long类型的,所以这样定义的话,编译器都会通过的
对于数据类型的提升,java里有如下规定:
1、搜用的byte型、short型和char型的值将被提升到int型
2、如果一个操作数时long型,计算结果就是long型
3、如果一个操作数时float型,计算结果就是float型
4、如果一个操作数时double型,计算结果就是double型
回复 使用道具 举报
黑马网友  发表于 2011-8-5 15:17:39
报纸
[color=Red]基础数据类型的自动转换:类型由低级向高级分别为(byte,short,char)---int--long--float--duble[/color][code=java]package heima.answer;

public class Test1 {
       
        public static void main(String[] args) {
                       
                int max = Integer.MAX_VALUE;
                int min = Integer.MIN_VALUE;
               
                System.out.println("int max="+max);
                System.out.println("int min="+min);
                //输出结果:
                //int max=2147483647
                //int min=-2147483648
               
                long lg = max+10;
                long lg2 = min-10;
                System.out.println("lg="+lg);
                System.out.println("lg2="+lg2);
                //输出结果:
                //lg=-2147483647
                //lg2=2147483646
               
               
                //long lg3 = 2147483649;//值2147483649超出了int的范围,需显式的声明为long类型,在数据2147483649后夹l或者大写的L。
                long lg3 =2147483649L;  // 显式的声明2147483649是long数据类型
                long lg4 = 2147483649L+2;
                System.out.println(lg3);//输出2147483649
                System.out.println(lg4);//输出2147483651
                /*
                 * lg 与lg2 的值为何与我们想的答案不一样?因为当int运算的结果超出它的范围时,结果大于max就变负数,结果小于min就变正数,
                 * 总结起来就是在结果前加了个"-"再继续运算,最后的结果很难解释。
                */
               
               
               
               
               
                //关于float 类型,最好也显式的声明,在数据的后面加上f或者F。
                //一个小数的默认类型是double,如1.1是double类型的
               
                float f1 = 1;   //int类型的1自动向上转为float。
                //float f2 = 1.1;  //报错,因为更高级的double不能自动转换为float
                float f2 = (float) 1.222; //强制转换
                float f3 = 1L;  //1L自动由long数据类型转换为float
                long long1 = (long) f1;
                double d1 = f1;
                double d2 = f2;
                double d3 = 1.222;
               
                System.out.println("f1="+f1);  //f1=1.0
                System.out.println("f2="+f2); //f2=1.222 精度不变
                System.out.println("f3="+f3); //f3=1.0
                System.out.println(long1); //1
               
                System.out.println("d1="+d1);
                System.out.println("d2="+d2);//由float类型转换而来的double值,结果变化大,精度提高了。
                System.out.println("d3="+d3);//d3=1.222 ,没经过转换的double,输入没变化。
                //d1=1.0
                //d2=1.100000023841858  -----------double这种数据类型转换起来比较麻烦,所以实际上用的不多。
                //d3=1.222
               
                /*
                 * 基础数据类型的自动转换:类型由低级向高级分别为(byte,short,char)---int--long--float--duble
                 *    float占用4个字节,和int是一样,也就是32bit.double占用8个字节,64bit。

                 */
               
               
               
               
        }

}[/code]
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马