黑马程序员技术交流社区

标题: 关于数据类型转换的问题,求解,谢谢 [打印本页]

作者: 刘海陆    时间: 2013-3-15 08:59
标题: 关于数据类型转换的问题,求解,谢谢
本帖最后由 小马过河 于 2013-3-15 15:04 编辑

class CastDemo
{
        public static void main(String[] args)
        {
                byte b = 2;
                /*下面这句我的理解是 2强制转换成byte型
                然后与b相加的结果也是byte型的,
                再赋值给byte型的变量b,
                为什么变异失败呢?*/
                b = b + (byte)2;
        }
}

作者: HM李帅    时间: 2013-3-15 09:15
很简单  byte short char做加减乘除操作时都要先自动转换成int类型再进行计算  你把接收的类型改成int就对了
作者: wangjinyu501    时间: 2013-3-15 09:29
同学,byte short char做加减乘除操作时都要先自动转换成int类型再进行计算 ,所以在计算完后你还需要将其转换成之前的类型, 像这样b = (byte) (b + (byte) 2);就可以了。
作者: 騛鹏    时间: 2013-3-15 09:30
楼上正解   byte short char做加减乘除操作时都要先自动转换成int类型再进行计算

改为 b = (byte)(b+(byte)2)   或者  b += (byte)2  


作者: HM张健    时间: 2013-3-15 09:30
张熙韬 发表于 2013-3-15 09:18
从这个例子,你应该懂了吧!

ls 是不是b + (byte) 2相加后向上转型变成int型了 我记得默认整形是int吧
作者: 刘海陆    时间: 2013-3-15 09:48
哦,明白了,谢谢大家!
作者: 陈原野    时间: 2013-3-15 09:54
对于数据精度不同的值进行算术运算,首先精度低的变量会自动向高精度转换,所以你再表达式的前面加上强制类型转换符就可以了,例:byte b = 2;   b = (byte)(b+2);  
作者: 刘海陆    时间: 2013-3-15 09:58
騛鹏 发表于 2013-3-15 09:30
楼上正解   byte short char做加减乘除操作时都要先自动转换成int类型再进行计算

改为 b = (byte)(b+(byte ...

为什么 b+=(byte)2;这个可以呢,他不也是进行加法运算吗??
作者: 沉默de羔羊    时间: 2013-3-15 10:01
本帖最后由 沉默de羔羊 于 2013-3-15 10:05 编辑

这个题是基本数据类型之间的转型问题:
简单数据类型的转换分为两种:自动转换和强制转换

自动转型 : 当一个较“小”的数据和较“大”的数据一起运算的时候,系统将自动将较“小”的数据转换为较“大”的数据,再进行运算。
自动转型,要遵守下面的规则:
1. 所有的byte、short、char类型的值将提升为int类型;(其中特殊的是char转换成int的时候,返回的是char的ascii码)
2.如果有一个操作数是long类型,计算结果是long类型;
3. 如果有一个操作数是float类型,计算结果是float类型;
4.如果有一个操作数是double类型,计算结果是double类型;
自动类型转顺序如下:
byte->short(char)->int->long->float->double

强制转换: 将“大”数据转换为“小”数据时,可以使用强制类型转换,但是格式为:小数据类型 变量=(小)大数据类型数值。

跟据上面的知识点:

该题目解答:
b=(byte)(b+2);
也就是byte会自动转型成int,b+2返回值的类型是int,所以需要强行转换成byte就可以了!
而你的b=b+(byte)2,问题所在是,你认为他们两个都是byte相加返回的值类型也是byte,其实这个想法是正确的,但是java内置的一些规则,只要byte计算,都会自动转型成int.

      

作者: 沉默de羔羊    时间: 2013-3-15 10:06
我去,明明回答在前面的,怎么排到这里了!
作者: 刘海陆    时间: 2013-3-15 10:07
沉默de羔羊 发表于 2013-3-15 10:01
这个题是基本数据类型之间的转型问题:
简单数据类型的转换分为两种:自动转换和强制转换

请问一下,为什么b+=2;不会报错呢,这不也是将int 赋值给byte吗
作者: tianyun    时间: 2013-3-15 10:27
java数据在运行时会自动提升等级(数据范围)b = b + (byte)2;此时b已经提升为int类型+byte后仍为int,可以使用+=运算避免数据类型提升。
作者: 沉默de羔羊    时间: 2013-3-15 10:27
小马过河 发表于 2013-3-15 10:07
请问一下,为什么b+=2;不会报错呢,这不也是将int 赋值给byte吗


刚才公司同事让我处理服务器了,没注意看到!
这里我帮你拆解一下。
b+=2,可以分解成:
先b+2,计算完结果,给b赋值,如下流程:
byte b = 2;--这里你是先开始赋值
b+2=4;
b=4;


作者: 刘海陆    时间: 2013-3-15 11:32
沉默de羔羊 发表于 2013-3-15 10:27
刚才公司同事让我处理服务器了,没注意看到!
这里我帮你拆解一下。
b+=2,可以分解成:

嗯,明白了,谢谢哈
作者: 刘海陆    时间: 2013-3-15 11:42
沉默de羔羊 发表于 2013-3-15 10:27
刚才公司同事让我处理服务器了,没注意看到!
这里我帮你拆解一下。
b+=2,可以分解成:

突然,我又有了一个想法,按照你的去做,如果这样的呢:
byte b=2;
b+=128;
上面的代码应该是错误的?应为b+2=130,然后b=130;这个应该是错误的!
但是运行结果却没有错!
作者: 黑马-王鹏    时间: 2013-3-15 11:58
我的回答和楼上的很多哥们差不多,分享几道
  1. class Demo1

  2. {

  3. public static void main(String[] args)

  4. {

  5. byte b = 3;

  6. b = 2+b;

  7. System.out.println(b);

  8. }

  9. }
复制代码
结果:编译不能通过,可能损失精度
分析原因:因为byte在内存占2个字节,整数2在内存中占四个字节,当2+b在运算过程会把b自动提升到4个字节进行运算,运算完毕会把占四个字节的5赋予占两个字节的b,这样做就可能损失精度。
解决途径:(1)把 b = 2+b;改为: b = byte(2+b);这叫强制转换,即把占四个字节的数int强制转换成byte

到面试中的关于这方面的题,希望对你有帮助
short s1 = 1;  s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?
对于short s1 = 1; s1 = s1 + 1; 由于s1+1运算时会自动提升表达式的类型,所以结果是int型,再赋值给short类型s1时,编译器将报告需要强制转换类型的错误。
对于short s1 = 1; s1 += 1;由于 += java语言规定的运算符,java编译器会对它进行特殊处理,因此可以正确编译。


作者: 刘海陆    时间: 2013-3-15 12:05
黑马-王鹏 发表于 2013-3-15 11:58
我的回答和楼上的很多哥们差不多,分享几道结果:编译不能通过,可能损失精度分析原因:因为by ...

哦,原来是特殊处理,貌似我有点钻牛角尖了:D
作者: 张文星    时间: 2013-3-15 12:40
在java运算中会把低精度的自动转换成高精度的,但高精度的转换成低精度的就需要申明强制转换了,byte在内存中占用一个字节,int占用四个字节,你的问题中在运算 时会先将数据转换成int型,得出的结果自然也会是int,所以在赋值给byte型的b时候会出错
改成: b = (byte)(b + (byte)2);
也可以是:int c = b + (byte)2;

作者: 沉默de羔羊    时间: 2013-3-15 13:04
小马过河 发表于 2013-3-15 11:42
突然,我又有了一个想法,按照你的去做,如果这样的呢:
byte b=2;
b+=128;

这里,为什么说是错了呢?这里你是不是表达意思没有说明白!

我上面给你分析了它解析的原理!
或者这么说吧,java规范里也说过,A+=B,其实可以看做是A=(T)(A+B)这种形式,其中T是A的数据类型!
作者: 刘海陆    时间: 2013-3-15 13:12
问题已解决,怎么把分类改成已解决呢?




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