java赋值问题int long short
语句1longl=0xffffffffff;//编译结果:整数值太大语句2longl=0xffffffffffL;//编译结果:成功从这个例子可以看出:在编译第一个语句时...
语句1 long l=0xffffffffff; //编译结果:整数值太大
语句2 long l=0xffffffffffL; //编译结果:成功
从这个例子可以看出:在编译第一个语句时,系统已经把一个整数%默认成了类型int%,然后用int型数值0xffffffffff给long型变量l赋值
语句3 short s=100; //编译成功
这个语句中100是不是也被默认成了int,如果是,为什么一个int型数据可以赋值给short型而不没有损失精度?如果不是,为什么在语句1中数值却要被默认成int型?百思不解,请高手指教。
其实以前我一直认为数值在编译时是没有数据类型之分的,只有当它赋值给常量的时候才有了数据类型的分别,例如int a=50;50就是一个数,不属于任何数据类型,而常量a才有类型,它属于int型。
或者换个角度说,所有基本数据类型从本质上说只有存储方式的和存储空间的区别,与数值无关都是0和1而已。
可是自从遇到上面那个问题后我迷茫了,难道系统遇到一个数值时候要先给它一个临时空间,然后从这个临时空间里赋值到常量所在的空间,如果真是这样,系统分配临时空间的规则是什么?求解~
我相当于提出了两个问题,如果告诉我一个也请说出来,不胜感激,在线等
遗憾的是百度知道不能讨论,谢谢你们的回答,不过我想你们并没明白我的意思,语句1的报错原因我当然知道,我想问的不是它为什么错;语句3的赋值不能超过-32768——32767的范围,这也不是我想问的问题,我想问的不是语法问题,而是编译原理
总结下我的意思1、long型赋值时把数值默认成int型(不加L时)
2、short型赋值时把数值默认成int型
3、int型不能向short型直接转换
对于第一条我觉得是对的,事实上经过检验对double常量直接赋整数值时,也是把数值先默认成int型,由此可知第二条肯定也是对的,第三条无可否认也是对的,问题在于第二条和第三条是矛盾的啊~~~
另外我的问题中好像把变量a说成常量a了,汗
我再加10分 有能教我的朋友吗 谢谢了 展开
语句2 long l=0xffffffffffL; //编译结果:成功
从这个例子可以看出:在编译第一个语句时,系统已经把一个整数%默认成了类型int%,然后用int型数值0xffffffffff给long型变量l赋值
语句3 short s=100; //编译成功
这个语句中100是不是也被默认成了int,如果是,为什么一个int型数据可以赋值给short型而不没有损失精度?如果不是,为什么在语句1中数值却要被默认成int型?百思不解,请高手指教。
其实以前我一直认为数值在编译时是没有数据类型之分的,只有当它赋值给常量的时候才有了数据类型的分别,例如int a=50;50就是一个数,不属于任何数据类型,而常量a才有类型,它属于int型。
或者换个角度说,所有基本数据类型从本质上说只有存储方式的和存储空间的区别,与数值无关都是0和1而已。
可是自从遇到上面那个问题后我迷茫了,难道系统遇到一个数值时候要先给它一个临时空间,然后从这个临时空间里赋值到常量所在的空间,如果真是这样,系统分配临时空间的规则是什么?求解~
我相当于提出了两个问题,如果告诉我一个也请说出来,不胜感激,在线等
遗憾的是百度知道不能讨论,谢谢你们的回答,不过我想你们并没明白我的意思,语句1的报错原因我当然知道,我想问的不是它为什么错;语句3的赋值不能超过-32768——32767的范围,这也不是我想问的问题,我想问的不是语法问题,而是编译原理
总结下我的意思1、long型赋值时把数值默认成int型(不加L时)
2、short型赋值时把数值默认成int型
3、int型不能向short型直接转换
对于第一条我觉得是对的,事实上经过检验对double常量直接赋整数值时,也是把数值先默认成int型,由此可知第二条肯定也是对的,第三条无可否认也是对的,问题在于第二条和第三条是矛盾的啊~~~
另外我的问题中好像把变量a说成常量a了,汗
我再加10分 有能教我的朋友吗 谢谢了 展开
3个回答
展开全部
你有java 2 参考大全 这本书吗??
那上面有关于这个的解释
我看过记不大清楚了
说一点我自己的看法 可能不太对
我认为你第一个语句是少加了L,才报的错,这是语法的问题吧,不加后缀,系统会认为你要去赋值给一个int型变量,就会报错
第三个语句不报错,那是因为,short型的变量取值范围在0——255之内,这个范围里面的数可以直接赋值给short。你可以试试把266赋值给short变量,或者你可以试试这样 int a =5,short b = a ,这样也通不过,需要强制转换,
short b =(int)a,这时没问题,因为5不超过0--255这个范围。但是你试试这样
int a =265,short b = (int)a,也不报错,但是你打印出来b,就会发现损失精度了
java是这样,当你声明一个变量后,系统就在栈里存储了这个变量,变量的实际存储空间在堆栈里,只有你给这个变量赋值(实例化)时,系统才会在堆栈里new出一块空间,然后把你要赋值的数值转化成二进制,这时,如果你赋值的数值超过这个类型的变量的数值范围,就会放不下,所以编译就会报错。
数值是没有类型的,只有变量才有类型
那上面有关于这个的解释
我看过记不大清楚了
说一点我自己的看法 可能不太对
我认为你第一个语句是少加了L,才报的错,这是语法的问题吧,不加后缀,系统会认为你要去赋值给一个int型变量,就会报错
第三个语句不报错,那是因为,short型的变量取值范围在0——255之内,这个范围里面的数可以直接赋值给short。你可以试试把266赋值给short变量,或者你可以试试这样 int a =5,short b = a ,这样也通不过,需要强制转换,
short b =(int)a,这时没问题,因为5不超过0--255这个范围。但是你试试这样
int a =265,short b = (int)a,也不报错,但是你打印出来b,就会发现损失精度了
java是这样,当你声明一个变量后,系统就在栈里存储了这个变量,变量的实际存储空间在堆栈里,只有你给这个变量赋值(实例化)时,系统才会在堆栈里new出一块空间,然后把你要赋值的数值转化成二进制,这时,如果你赋值的数值超过这个类型的变量的数值范围,就会放不下,所以编译就会报错。
数值是没有类型的,只有变量才有类型
展开全部
我是这样理解的:数值读取时如不加(L等)全被默认为int ,赋值时才按定义类型转化,读取时按int来要求.例如long l =0xf;就不会报错.因为0xf大小满足int要求
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
java里 转换原则
从低精度向高精度转换,你没加L当然是 int型。
3、这时并未超过short表示的最大数。
int型的数,short:2B,int:4B,long:8B
从低精度向高精度转换,你没加L当然是 int型。
3、这时并未超过short表示的最大数。
int型的数,short:2B,int:4B,long:8B
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询