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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 吴扬 中级黑马   /  2012-6-18 23:32  /  1940 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 吴扬 于 2012-6-19 13:24 编辑

一段很简单的代码,但是不是很清楚它每一步是怎么转换的,请大家帮忙看看
byte b = 1;
char c = 2;
short s = 3;
int i = 4;
float f = 5.0f;
double d = 4.0;
               
double sum = b*c*d*s*i*f;
知道这个sum的结果最终是双精度浮点型的,但是这个运算过程中数据的类型是怎么转换的还不是很清楚,求高手解答!

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

8 个回复

倒序浏览
byte b = 1;//这里的b = 1,这个于相当于int类型的 1
char c = 2;//这里的c = 2,这个于相当于int类型的 2
如果是这样的就不一样了
byte b = '1';
char c = '2';

这样你就可以看清楚了
byte b = 1;
                char c = 2;
                int in = 1;//in作为判断用的
                short s = 3;
                int i = 4;
                float f = 5.0f;
                double d = 4.0;
                                
                double sum = b*c*d*s*i*f;
                System.out.println(in==b);//注意这里
                System.out.println("b:"+b+"");
                System.out.println("c:"+c+"");
                System.out.println("s:"+s+"");
                System.out.println("i:"+i+"");
                System.out.println("f:"+f+"");
                System.out.println(sum);

结果
true//结果是true 所以这里的b = 1,这个于相当于int类型的 1

b:1
c:
s:3
i:4
f:5.0
480.0

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

回复 使用道具 举报
类型转换的规则:
1. byte,short,char之间不会互相转换,他们三者在计算时首先会转换为int类型.
2.容量小的类型默认转换为容量大的数据类型;数据类型按容量大小排序为:byte,short,char->int->long->float->double
3.容量大的数据类型转换为容量小的数据类型时,要加上强制转换符
有多种类型的数据混合运算时,系统首先自动的将所有数据转换成容量最大的那一种数据类型,然后再进行计算.
这是java数据类型运行的机制,也是遵守的规则.
double sum = b*c*d*s*i*f  个人理解:是java运行到b*c*d的时候就已经转成的容量最大的类型,所以后面的转换都向着这个double值在进行运算。

点评

学习了  发表于 2012-6-19 17:15
回复 使用道具 举报
在java中有这些byte、char、short、int 、float、double 不同的数据类型,其余的我就不一一列举了,这些数据类型的所占的字节大小是不同的,也就是这些类型的精度有高有低,double sum = b*c*d*s*i*f; sum是double类型的,所以结果会是double型,双精度长整型是列举出来的这些中精度最高的,请记住一句话,这句话是我们老师教我的,我一直记在心中:高转低,强制。高级的数据如double转换成低级的int型,必须强制转换,
例:
double   s=0.001;
int   x;
x=(int)s;
输出x的值为0.
低级转高级,java会自动给你转换,所以你的double sum = b*c*d*s*i*f;这里是不会报错的。
如果写出这样
double   s=0.001;
int   x;
x=s;
程序会提示出错哦。
回复 使用道具 举报
rchm 黑马帝 2012-6-19 00:10:59
报纸
byte b = 1;
char c = 2;
short s = 3;
int i = 4;
float f = 5.0f;
double d = 4.0;
               
double sum = b*c*d*s*i*f;
运算符相同,所以优先级相同,运算顺序自左向右!
x1=b*c byte和char都转为int,因为他们不能互转
x2=x1*d  x1由int型转为double型
x3=x2*s  s由short转为double型
x4=x3*i  i由int转为double型
x5=x4*f  f由float转为double型
回复 使用道具 举报
张頔 发表于 2012-6-18 23:51
byte b = 1;//这里的b = 1,这个于相当于int类型的 1
char c = 2;//这里的c = 2,这个于相当于int类型的 2
...

那如果数据类型不统一的话,是不是首先会把byte类型的b、char类型的c和short类型的s自动转换成int类型的再参加运算呢?运算之后再把结果转换成float的再参加运算,最后再转成double类型的,过程是这样的吗?
回复 使用道具 举报
本帖最后由 晏文根 于 2012-6-19 00:27 编辑

对于java转换可以分为自动转换和强制转换:
自动转换是不需要使用代码进行干预;而强制转换是需要用显示指定要转换的类型。

基本类型之间相互转换,要实现自动转换要满足以下几个条件:
1.转换双方的类型必须兼容,例如int和long兼容,而int和boolean不兼容
2.目标类型比源类型范围要大,如long分配内存大小8个字节,int只有4个字节,所以long类型的范围比int类型大。
其大致转换如下图:

当然boolean类型例外,其他之间才可以转换,规则如图:(按箭头方向是自动转换,如果刚过来是强制转换)
你可以根据这些规则,去看你的代码,应该会很清楚地。

zhang.PNG (9.91 KB, 下载次数: 15)

zhang.PNG

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

回复 使用道具 举报
表达数值范围小的数据类型赋给范围大的数据类型或者两者参与运算,是自动类型转换,是系统自动完成的
有两条路径1、byte->short->int->long->float->double
2、char->int->long->float->double
如果顺序反过来,把右边的赋给左边的,就是强制类型转换,需要手动指定
回复 使用道具 举报
吴扬 中级黑马 2012-6-19 13:24:31
9#
谢谢大家了,我已经明白了!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马