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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© guobin_lu 中级黑马   /  2013-3-31 23:33  /  1828 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. short s1 = 1; s1 = s1 + 1;//有什么错?
  2. short s1 = 1; s1 += 1;//有什么错?
复制代码

7 个回复

倒序浏览
因为short不能显示转换成Int
Int 的精度比short高  低精度不能转换成高精度
s1=s1+1//1自动判断为Intl类型,所以不能相加
s1+=1会自动转换s1的类型
回复 使用道具 举报
  • short s1 = 1; s1 = s1 + 1;//有什么错?//整数默认类型int,这句中1为int型,相加时系统会将short提升为int,因此会损失精度,因此编译通不过;也可以写成s1=(short)(s1+1);
  • short s1 = 1; s1 += 1;//有什么错?/“+=”运算时,系统会自动判断1是否在short型范围内,1在范围内,这时系统会将1强制转换成short型,因此编译可以通过。


回复 使用道具 举报
             //short s1 = 1; s1 =s1  + 1;
            //等号左侧是 short类型,等号右侧的算术表达式默认计算结果为int类型,所以应该把右侧转换成short类型
            //正确写法:
            short s1 = 1; s1=(short)(s1+1);
            //short s1 = 1; s1 += 1;//这个写法没错
            Console.WriteLine(s1);
            Console.ReadLine();
回复 使用道具 举报
这个根本原因在于.net 的CLR,有点像java的虚拟机。
在CLR中,所有小于4字节的基元类型都会先转换为4字节的int或者float。因此上面那段代码是这样的:
short s1 = 1;
  s1 = s1 + 1;//s1的值和常量1压入栈中,然后将s1和1的值弹出堆栈进行加法运行,这个结果是2,但是这个2是Int32的,不是shor。然后将结果2(Int32)压入堆栈,再将这个2弹出赋值给short类型的s1,可是可以发现堆栈中的2是Int32的,他不能隐式转换为short!!!!!!
  解决办法很简单,就是加上个强制转换就OK了。
  
如果你能够反汇编一下这段代码就一切了然入目了。可以看我的这篇博客,有这方面的内容介绍http://blog.csdn.net/dingxiang506/article/details/8480089
回复 使用道具 举报
    short s1 = 1; s1 = s1 + 1;//有什么错?
    short s1 = 1; s1 += 1;//有什么错?

对于第一句s1 = s1 + 1存在一个int不能隐式转换为short的错误,在编译器将s1 = s1 + 1进行编译的时候,会将1自动编译成int32类型,并且等式右边的s1会隐式转换为int32,再和1相加,从而结果为int32类型,而等式右边是short类型,int32不能隐式转换为short所以错误     
而第二句 s1 += 1,编译器在进行编译的时候是这样s1=(short)(s1+1);把他们相加的结果在进行强类型转换!故没有错误!
回复 使用道具 举报
short s1 = 1; s1 = s1 + 1;//有什么错?
short s1 = 1; s1 += 1;//有什么错?

赋值运算符/算数运算符在进行运算时,参与运算的操作数的类型必须相同,并且其运算结果也与操作数相同。
所以,short s1 = 1; s1 = s1 + 1 在运算时首先把等号右边的转换为两个int 类型的数值相加,并且运算结果为int,然后将int类型的结果赋值给short类型的s1,而int类型是无法自动转换为short类型的,所以会出现:“无法将类型‘int’隐式转换为‘short’”的错误。不过可以显式转换:s1=(short)(s1+1)
short s1 = 1; s1 += 1 则是先把1转换为short类型的,再参与运算,结果当然为short类型的,所以不会出错。
回复 使用道具 举报
1默认为int类型,高精度不能自动转换成低精度,所以需要强制类型转换
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马