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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?

14 个回复

正序浏览
s1=s1+1,s是short,占2个字节,1是int类型,占4个字节,两个不同类型的转换,得采取强制类型转换才行,否则不能赋给等式左边的short类型的变量s  s1+=1;+=是赋值运算,会自动转换。
回复 使用道具 举报
本帖最后由 liuhao411 于 2012-3-17 09:37 编辑
liuhao411 发表于 2012-3-16 00:54
s =1.s=s 1。第三个s是short形的而后面1是Int形的,所以第三个S自动提升为int形的。即(s十1)为int。而S十 ...


short s1=1;s1=s1+1;(这里的1是4字节的,而short s=1是2字节的),所以在执行s1=s1(short)+1这时s1会由short提升到int.所以这时你再将s1+1赋给s1,就有问题了。而s1+=1,没有提升这个过程,一直是short的。
回复 使用道具 举报
s1是short类型,1是int类型,相加后的结果是int类型,short类型的s1直接接收int类型的结果肯定不行。但是可以使用强制转换符号short将结果转化为short类型后赋值s1,可以写成s1=(short)(s1+1);
回复 使用道具 举报
在程序
public class FuZhi
{
  public static void main(String args[])
  {
    short s1=1;
    s1=s1+1;
    System.out.println("s1="+s1);
   }
}

这个程序的错误是你定义的s1是short类型的占两个字节,二在s1=s1+1中由于整数1在java中默认是int类型占四个字节,所以在(s1+1)的结果就会自动提升成int类型,而你要把int型的结果赋值给short型,导致数据类型不匹配了,自然就错了。
2在程序
public class FuZhi
{
  public static void main(String args[])
  {
    short s1=1;
    s1+=1;
    System.out.println("s1="+s1);
   }
}
是没有错误的 ,因为+=是一个赋值符,会直接把结果转换成相应的类型的
回复 使用道具 举报
liuhao411 发表于 2012-3-16 00:54
s =1.s=s 1。第三个s是short形的而后面1是Int形的,所以第三个S自动提升为int形的。即(s十1)为int。而S十 ...

在程序
public class FuZhi
{
  public static void main(String args[])
  {
    short s1=1;
    s1=s1+1;
    System.out.println("s1="+s1);
   }
}

这个程序的错误是你定义的s1是short类型的占两个字节,二在s1=s1+1中由于整数1在java中默认是int类型占四个字节,所以在(s1+1)的结果就会自动提升成int类型,而你要把int型的结果赋值给short型,导致数据类型不匹配了,自然就错了。
2在程序
public class FuZhi
{
  public static void main(String args[])
  {
    short s1=1;
    s1+=1;
    System.out.println("s1="+s1);
   }
}
是没有错误的 ,因为+=是一个赋值符,会直接把结果转换成相应的类型的。
回复 使用道具 举报

RE: short s1 = 1; s1 = s1 1;有什么错? short s1 = 1; s1 = 1;有什么错?

s =1.s=s 1。第三个s是short形的而后面1是Int形的,所以第三个S自动提升为int形的。即(s十1)为int。而S十1赋给左边的s,.而这个S却是short的。s =1.却没有提升。
回复 使用道具 举报
李飞 中级黑马 2012-3-15 14:31:35
8#
从低精度向高精度的顺序为:
byte 、short、int、long、float、double、char

当算术运算的时候,低精度会自动的向高精度转换,

而高精度是不会自动向高精度转换的,因为可能会丢失数据或是影响精确度。
回复 使用道具 举报
冯建鹏 黑马帝 2012-3-15 02:25:57
7#
short s1 = 1; s1 = s1 + 1;有什么错?  类型转换问题:因为s1是short类型的占2个字节, s1=s1+1 java默认数字都是int类型的。int类型占4个字节,将4个字节放入到2个字节里面有可能会发生精度损失,就像毕老师说的一个2俩的碗,装4俩的饭有可能承不下,会溢出。需要把1强制转换为short类型的,在1前面加上(short)也就等于是s1=s1+(short)1;
short s1 = 1; s1 += 1;有什么错?这句没错。。。+=是一个运算符,毕老师说这个字符可以理解为s1=(short)(s1+1)     //s1+1虽然已经自动提示为int类型,但是前面加了强制转换。
回复 使用道具 举报
其实这就是基本数据类型的相互转换,s1是short类型,1是int类型。当两个数据相加以后是一个int类型,然后赋值给一个short类型是不行的。要赋值给short类型,得在算式后面加上强制转换符号(short),理解一点:低级数据类型隐式转换成高级数据类型(s1+1),相反,高级数据类型转换成低级数据类型时得加要相应的强制转换符(short)(s1+1)。
回复 使用道具 举报
前一个问题是:s1类型为short型,1为int型,=右边s1与1做运算,s1向上提升为int型,运算后赋给左边的short型,java是强类型语言,不能赋值,所以错误。
后一个问题是:+=是一个运算符,并不完全等于做加1运算,相当于在s1的类型基础上加1,并不涉及类型提升问题。
回复 使用道具 举报
第一种没有进行类型的转换都是short类型,但是第二种,在进行+1的时候s1进行类一次类型的提升转变为int类型,然后在赋值给short类型的时候肯定会报错,毕老师在视频中说过这个例子
回复 使用道具 举报
第一个有错   s1是short 类型 , 1是int类型,   s1+1运算结果是int类型 ,int转为short要加强制转换 s1 =(short)(s1+1)
第二个没错    += 是赋值运算符 没有类型转换 直接把(s1+1)赋值给s1  这是一个赋值运算
回复 使用道具 举报
s1=s1+1,s是short,占2个字节,1是int类型,占4个字节,这2个相加让s也转换成int类型了,不能赋给等式左边的short类型的变量s;
   s1+=1;这个只做赋值运算,不会转换类型,自加本身会自动转换。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马