本帖最后由 朱玉玺 于 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),就等于说:编译器,爷只要不超过杯子容量的水,如果不超过杯子容量就都给我,如果超过容量,多余的水给爷扔了,爷不要啦。 |