黑马程序员技术交流社区

标题: 类型装换 [打印本页]

作者: guobin_lu    时间: 2013-3-31 23:33
标题: 类型装换
  1. short s1 = 1; s1 = s1 + 1;//有什么错?
  2. short s1 = 1; s1 += 1;//有什么错?
复制代码

作者: 张振    时间: 2013-3-31 23:45
因为short不能显示转换成Int
Int 的精度比short高  低精度不能转换成高精度
s1=s1+1//1自动判断为Intl类型,所以不能相加
s1+=1会自动转换s1的类型
作者: 李晓峰    时间: 2013-4-1 00:28



作者: 王鹏程    时间: 2013-4-1 00:32
             //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();
作者: 王宝生    时间: 2013-4-5 15:26
这个根本原因在于.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
作者: HM朱百青    时间: 2013-4-5 16:29
    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);把他们相加的结果在进行强类型转换!故没有错误!
作者: 史鹏飞    时间: 2013-4-6 10:23
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类型的,所以不会出错。

作者: 严夫    时间: 2013-4-8 11:04
1默认为int类型,高精度不能自动转换成低精度,所以需要强制类型转换




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