黑马程序员技术交流社区

标题: 关于强制转换数据类型的问题 [打印本页]

作者: bushangkoukou    时间: 2013-5-22 16:55
标题: 关于强制转换数据类型的问题
本帖最后由 bushangkoukou 于 2013-5-22 23:23 编辑

                                                int b=0;
                        byte b1 = 3;
                        byte b2 = 4;
                        b=(byte)(b1+b2);
                        System.out.println(b);

为什么这个是可行的?b  不是int 数据类型么,强制转化成byte类型,怎么还能赋值给int型?
作者: 骑上最爱    时间: 2013-5-22 17:32
你这个是把byte放在int里面,当然可行了。
byte占用1个字节,int占用4个字节,怎么都能放的下,所以没问题。
作者: Super_Class    时间: 2013-5-22 17:35
|——3  默认是int类型的。byte b1 = 3;完成了自动类型转换

b是int类型的变量(byte)(b1+b2);是byte类型的变量,因为int类型占用4个字节

byte类型的才占用1个字节。所以这样是没有问题的。

作者: youngster    时间: 2013-5-22 18:05
基本数据类型其实就是存储的空间大小不一样,byte两个八位,int四个八位,说白了 楼主所述问题就是说byte型可以赋值到int型,这个赋值的过程就是存储的过程,自然byte型会存到int型的低两个八位中。视频中后边会出现将int的低两个八位存到byte中的情况。
作者: 刘海陆    时间: 2013-5-22 20:42
byte可以自动转换成int ,这个是java的自动类型转换功能。也就是小类型可以自动转换成大类型


作者: student    时间: 2013-5-22 21:04
容量小的数据类型,自动转换转换为容量大的数据类型,不会造成精度丢失,是安全的。数据类型按容量大小排序为:
byte,short,char->int->long->float->double
byte,short,char之间不会互相转换。它们三者在计算时,首先转换为int类型。
  1.                 int b = 0;
  2.                 byte b1 = 3;
  3.                 byte b2 = 4;
  4.                
  5.                 /*        1. b1+b2 :相加后的值自动转换成int类型
  6.                  *         2. (byte) (b1 + b2) :强制将int类型转换成byte类型
  7.                  *         3. b = (byte) (b1 + b2) :将byte类型赋值给int变量,容量小的数据类型,
  8.                  *                                                             转换为容量大的数据类型,不会造成精度丢失
  9.                  */
  10.                 b = (byte) (b1 + b2);
  11.                 System.out.println(b);
复制代码

作者: 棉/mg花/x糖    时间: 2013-5-22 21:37
本帖最后由 棉/mg花/x糖 于 2013-5-22 21:38 编辑

楼主,你好,我来帮你解释这个问题!!
  1. int b=0;
  2. byte b1 = 3;
  3. byte b2 = 4;
  4. b=(byte)(b1+b2);
  5. System.out.println(b);

复制代码
这里,先说明一点:
(1)类型级别的数据赋值给类型级别的变量时会丢失精度(还有可能会报错);
(2)类型级别的数据赋值给类型级别的变量时会有个类型自动升级的过程(隐式
         的,由系统自动完成)。

这里,明显是byte数据赋值给int型数据,显然不会报错。
并且,b1,b2本身就是byte型,故(byte)(b1+b2)和(b1+b2)是完全等价的。
加不加上(byte)效果一样。

希望这个解释,能对楼主有所帮助。


作者: 棉/mg花/x糖    时间: 2013-5-22 21:41
骑上最爱 发表于 2013-5-22 17:32
你这个是把byte放在int里面,当然可行了。
byte占用1个字节,int占用4个字节,怎么都能放的下,所以没问题 ...

求追加技术分啊.........谢谢啦^_^
作者: Sofoul    时间: 2013-5-22 22:05
   int b=0;
                         byte b1 = 3;
                         byte b2 = 4;
                         b=(byte)(b1+b2);
                         System.out.println(b);
我觉得你写得有问题,b1,b2都是byte类型的干吗还要强制转换成byte本身就是byte。int是四个字节,把byte赋给int是不用转换类型的,因为byte会有一个自动提升的过程
作者: 黄炳期    时间: 2013-5-22 22:09
大神们都回复的挺好的,我就来一个对比吧

b1,b2是变量,数值是变化的,系统无法判断变量值是否在byte(-128~127)范围内,可能损失精度,如下图所示

强制转换成byte大小后运行成功。

作者: 黄炳期    时间: 2013-5-22 22:10
黄炳期 发表于 2013-5-22 22:09
大神们都回复的挺好的,我就来一个对比吧

b1,b2是变量,数值是变化的,系统无法判断变量值是否在byte(-128 ...

第一次回答问题;P
作者: 逸盏清茶    时间: 2013-5-22 22:20
基本数据类型其实就是存储的空间大小不一样,byte两个八位,int四个八位,说白了 楼主所述问题就是说byte型可以赋值到int型,这个赋值的过程就是存储的过程,自然byte型会存到int型的低两个八位中。视频中后边会出现将int的低两个八位存到byte中的情况。


byte 不是一个8位吗




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