黑马程序员技术交流社区

标题: 这个数据类型是怎样变化的?求解 [打印本页]

作者: 侯凯斌    时间: 2013-1-30 14:05
标题: 这个数据类型是怎样变化的?求解
本帖最后由 侯凯斌 于 2013-2-18 11:47 编辑

如果运行类似  short s=5; s=s+2; 这样的语句,是会出现错误的。s = s + 2; 中,在进行算术运算 s + 2 时,s 是之前定义的s的一个复制还是s本身?如果是s本身,那么算术运算后s对应的存储区域类型提升为int,但是 s = s + 2 赋值号左边的s 的数据类型并没有变化,在编译环境的眼中,仍然是最初定义的那个s,所以赋值失败??或者是其他的什么情况?     s = 8;是正确的,那么 8 和 (s + 2 )的区别是什么?

作者: 李挺    时间: 2013-1-30 15:57
个人观点:
short s=5; s=s+2;的执行是这样的:首先定义一个s为short 型,然后s=s+2分二步完成:第一步:计算s+2,由于s是short,2是int型,他们的计算结果应该是int型,即结果是int型的数据7;第二部:将s+2的结果,就是int型的8,赋值给short型的s,问题就出现了,int是4个8位,short是2个8位,所以会报错:可能溢出。
作者: 黄鸿达    时间: 2013-1-30 16:01
我不知道你说的s=8是不是错了,是不是想说s=7是正确的,那么7 和s+2的区别是什么

short s=5 s=s+2 其实这里的2的类型是int  你如果一个short跟一个int相加,根据JAVA的自动向上转型,应该s=s+2  s的类型应该是int才可以编译成功
但是你这里的s是短整型short,所以必须强转类型才可以编译成功,也就是s=(short)s+2才可以。

至于7代表的是int 类型的7  系统默认定义的  如果你7L 就代表long 类型的7 如果7.0代表double类型 的7
(s+2)代表  一个short类型的变量s与1个int 类型的2做加法运算
作者: 张敬培    时间: 2013-1-30 17:00
在java中存在数据类型的自动转换,就是低精度类型向高精度类型之间的转换是自动,
short s = 5;//在这定义的s是一个short类型的数据,
s = s+3;//因为3是int类型,所以s+3转换后的类型是int类型,在这报错就是类型的转换有问题
因为java是一种强类型语言,如果高精度要向低精度转换,就要进行声明

在整个运算过程中,s的类型是有变换的
short s = 5;//在这s的类型是short类型的
s+3运行完成后,因为java存在自动类型转换,所以这时s的类型是int类型的
s=s+3;等号左边的s还是short类型的,因为s+3是int类型的,所以要改变s+3的数据类型
作者: 王昕    时间: 2013-1-31 17:26
自动类型转换只是在计算的时候由低向高看齐,但是变量s的类型不会改变。

计算s+2的时候,是把 s 的值取出,放在一个临时存储单元,然后和2相加,因为2是int,所以把取出的 s 的值补成32位,相加的结果保存在一个临时存储单元里。因为计算结果是32位,所以这个临时存储单元是32位的,所以由这个32位临时单元想16位的short型 s 赋值时会报错。
作者: 黑马刘向阳    时间: 2013-1-31 17:52
用 s += 2就避免强转了 ,
作者: 朱玉玺    时间: 2013-2-1 11:45
本帖最后由 朱玉玺 于 2013-2-1 12:29 编辑

对于赋值操作 short s=5,编译器是这样处理的:把5跟short的取值范围比较,如果在这个范围内,那么赋值成功;如果超出范围,就报错,比如你写成short s = 2147483647,同样是赋值操作,但编译失败。或者你可以这样形象的来想:s就是一个容器,比如一个杯子,5就是水,当把5赋给s时,有一个判断的步骤,要注入的水,超过了杯子的容量没?没有,就注入,超过就报错,然后盖上盖子。对于s=s+5:s是一个杯子,但这个杯子在编译期是戴着盖的,所以编译器不知道杯子里边有多少水,但又要求和,怎么办?编译器是这样干的:我不能把你里边的水取出来,我用一个比你更大的容器代表你(又建立一个引用),这个容器怎么选?编译器默认的容器是桶(int),“5”带表的水这个桶能装下吗?跟初始化语句一样,判断一次,能装下(如果不能,就用能装下水的容器代表你,比如s=s+2147483648,就会用缸(long)型代表杯子),那就用桶代表你啦,于是就建立了两个桶,把桶盖盖上;下一步就该把两个桶里边的水,装入s了,但编译器会问:哥们,这两个桶里我不知道总共有多少水(编译器有短期遗忘症,它没能力打开盖子),你一个杯子能不能装的下,如果超出你的容量,怎么办?你必须告诉我你要多少水!!!!如果在前边加个(short)(s+5),就等于说:编译器,爷只要不超过杯子容量的水,如果不超过杯子容量就都给我,如果超过容量,多余的水给爷扔了,爷不要啦。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2