黑马程序员技术交流社区
标题:
java 类型转换!
[打印本页]
作者:
李建锋
时间:
2011-12-7 00:05
标题:
java 类型转换!
short s1 = 1; s1 = s1 + 1;是否正确,为什么? short s1 = 1; s1 += 1;编译会通过吗?
作者:
段波
时间:
2011-12-7 00:40
short s1 = 1;
s1 = (short) (s1 + 1);
这样写是可以的,因为s1+1时由于1是int类型,不会自动转换为short型 ,此时就高不就低,相加后就会转换成int这时再赋给short型的变量就会报错,就好像张老师说的,你要把你个人当男人用,编辑器说不行,这时你强转,说不怕,出了问题我负责,当然就可以通过了。
short s1 = 1; s1 += 1;这是标准的运算方法,是可以的
作者:
zclove898
时间:
2011-12-7 00:56
short s1 = 1; s1 = s1 + 1这样编写会编译失败,应为s1是short类型,而1是int类型,因为这样编写会丢失精度。
short s1 = 1; s1 += 1这个是可以通过的,应为+=是赋值预算符,是把左右两边的数值的和赋给左边
作者:
唐秀启
时间:
2011-12-7 07:18
本帖最后由 benbenqi 于 2011-12-7 07:22 编辑
short s1 =1 ; s1= s1 + 1 //编译失败,是先做+1运算得到int型再赋给short型,丢失精度
short s1=1; s1 += 1 //编译通过,因为+=运算符在给s赋值时,自动完成了强制转换操作
作者:
赵燕燕
时间:
2011-12-7 10:28
short s1 = 1;
s1 = s1 + 1;//是错误的。进行了两次运算,先+后=,先将s1转换成整型(4个字节)再+1,赋值给short(2个字节)时,会损失精度。
要想编译通过必须进行强制转换:s1 =(short)( s1 + 1);
s1 += 1;//编译会通过.进行了一次运算,”+=“这个运算符进行了自动的强制转换。
作者:
方书堂
时间:
2011-12-7 11:16
本帖最后由 方书堂 于 2011-12-7 11:18 编辑
short s1=1;s1=s1+1;编译是不会通过的。因为short s1=1是吧s1定义为一个短整形,而S1+1因为1是Int型的。所以S1会被自动转换成Int型然后在加上1,结果也会是int型。而s1=s1+1左边市short型。右边是int型,直接赋值会损失精度。而S1+=1是可以被编译通过的,因为这个是一个赋值运算就是把s1+1值转换成short型再赋给s1也就是相当于S1=(short)(s1+1)
作者:
武超
时间:
2011-12-7 11:38
本帖最后由 武超 于 2011-12-7 11:39 编辑
short s1=1;s1=s1+1;编译是不会通过的。因为short s1=1将s1定义为一个short类形,而1是int类型的。short类型比int类型位数少,在运算s1+1时将结果隐式的转化成了int类型,运算完后要将(s1+1)赋值给s1,而s1是short类型的int型转化成short型不能隐式转换。
而short s1 = 1; s1 += 1;可以,就是一个赋值运算语句,自动强制转化
作者:
荣凯旋
时间:
2011-12-7 11:46
short s1 = 1; s1 = s1 + 1;编译时通过不了的,因为1是int型,s11=s1(会自动提升为int型)+1,这样无法赋值给左边的s1 会丢失精度,编译不通过
为什么? short s1 = 1; s1 += 1(这个完成了自动转换过程);编译通过!!
楼主加油吧 一起进6期丫 哈哈
作者:
t_mac
时间:
2011-12-7 12:40
本帖最后由 t_mac 于 2011-12-7 12:42 编辑
对于楼主这个问题,我拿byte类型来举例吧,道理是一样的。
byte b = 2;
b =b+ 3;
System.out.println(b);
编译结果是不对的,因为java中,整数类型默认的是int
而不同的类型之间是不能之间做运算的,对于整数来说可以做运算,但必须有一个操作为前提
就是自动类型提升,先要把两个数据提升为同一个类型,原则是小的向大的提升,上例中 b是byte
型占一个字节,而3默认为int型 为4个字节,所以要把b提升为四个字节
byte b=2 =00000010->00000000 00000000 00000000 00000010
int 3= 00000000 00000000 00000000 00000011
运算结果为 00000000 00000000 00000000 00000101
要想把以上的结果存到byte里 必须强制转换
b = (byte)(b+3); 而+=自动帮我们完成了这个动作,所以你写b+=3;是可以通过的;
可是这也带来一个问题 如果运算结果溢出即大于127或是小于-128也不会报错,所以大家使用的
时候要特别注意。
作者:
zoufan7410
时间:
2011-12-7 12:59
short s1 = 1; s1 = s1 + 1;编译会错误,是因为,s1定义为了short型,1 默认是int型,在进行运算时会有类型转化成int型再赋值给S1,此时S1是被定义为Short型,这时一个高精度赋值给低精度类型就损失精度, short s1 = 1; s1 += 1;编译正常,因为会有自动强制类型转换,
作者:
李建锋
时间:
2011-12-7 14:19
一楼说得精辟!
作者:
李明
时间:
2011-12-10 19:54
short s1 = 1; s1 = s1 + 1;是否正确,为什么?
不正确。因为s1是short类型,而s1+1运算的结果是int类型,因为1是int类型,所以s1+1的运算结果自动提升为int类型。所以不能把int类型的值赋给short类型。
short s1 = 1; s1 += 1;编译会通过吗?
正确。因为+=运算是自动完成强制转换的,相当于s1=(short)(s1+1),所以正确。
作者:
黄达标
时间:
2011-12-11 00:02
short s1 = 1; s1 = s1 + 1;不正确
因为在做s1+1的运算的时候,系统会将s1的类型转化为和1一样的int类型,而将所得到的intl类型的值赋给short型的s1的时候,系统将会报错。
short s1 = 1; s1 += 1;编译可以通过
因为 += 相当于赋值,并且没有类型的转换动作,它只是一次运算,没有相加的运算在里面。
俺也是初学者,终于碰到了一个能独立作答的问题了。
作者:
张帅
时间:
2011-12-17 16:30
都挺厉害的,上面说的都正确,没什么可说的了,分不好赚啊
作者:
刘健
时间:
2011-12-18 11:55
short s1=1;s1 = s1 +1;这个是编译不能通过的,s1+1已经被JAVA自动按int类型做处理了,要继续当做short用就需要做强制转换了
后面的是正确的
作者:
唐林渊
时间:
2011-12-18 16:15
第一个 错误的,应该在编译时就会提示错误,因为系统会检测到由short无法自动提升到int(就是你的数字1.)
第二个 正确的,因为+= 就是讲的那种强制类型转换,也就是说,只是运算。都是与+=前面的数是一个类型的.
作者:
杨银川
时间:
2011-12-18 18:48
我这里就简单说几句,short s1 = 1; s1 = s1 + 1;不正确,因为1是int型,s1 = s1 + 1后,s1就从short型变成int,所以不对,应该用到强制类型转换了,而 short s1 = 1; s1 += 1;是正确的,因为+=这个符号,是java内部定义的它可以自动进行类型转换。希望对你有帮助!
作者:
梁俊
时间:
2011-12-19 11:34
short s1 = 1; s1 = s1 + 1;
因为1为int类型,所以s1+1会自动提升表达式的类型为int,再赋值给short类型的s1时,编译器会报告需要强制转换类型的错误
short s1 = 1; s1 += 1;+=是Java语言规定的运算符,编译器会进行特殊处理,所以会正常编译
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2