黑马程序员技术交流社区
标题:
类型装换
[打印本页]
作者:
guobin_lu
时间:
2013-3-31 23:33
标题:
类型装换
short s1 = 1; s1 = s1 + 1;//有什么错?
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
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型,因此编译可以通过。
作者:
王鹏程
时间:
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