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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李明 黑马帝   /  2011-12-11 13:36  /  3143 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 李明 于 2011-12-12 13:30 编辑

        float t=3.5;//出错
        byte a=3;//却不出错,3不是int型吗?
        请大虾们解答一下。

6 个回复

倒序浏览
本帖最后由 ◇半度微凉 于 2011-12-11 13:59 编辑

float t=3.5;肯定是错误的啊!首先3.4数值常量默认情况下是double类型,如果赋值给f,那么就要进行数据类型转换,将由double转换成float类型,但是浮点型(float)常量数值默认是double类型的,而double类型的数据表示的范围要比float类型的数据表示范围要大,所以不能进行自动类型转换,只能强制转换,这时可以写成float f = (float)3.5;或者在3.5后面加上'f'或'F',即float f = 3.5f; 而第二个byte a=3中,因为byte和int之间可以相互进行隐式转换,所以byte已经自动转换成int了,所以不会报错!

评分

参与人数 1技术分 +2 收起 理由
admin + 2

查看全部评分

回复 使用道具 举报
李明 黑马帝 2011-12-11 14:06:29
藤椅
◇半度微凉 发表于 2011-12-11 13:56
float t=3.5;肯定是错误的啊!首先3.4数值常量默认情况下是double类型,如果赋值给f,那么就要进行数据类型 ...

                int b=1;
                byte a=b;//为什么这个就会报错?
回复 使用道具 举报
float t=3.5;
  错误原因:3.4数值默认是double类型,t是float类型的,这两个类型在内存中点的字节数不同,如果赋值给t,那么就要进行数据类型转换,将由double转换成float类型,double类型的数据表示的范围要比float类型的数据表示范围要大,所以不能进行自动类型转换,只能强制转换,这时可以写成float f = (float)3.5;或者在3.5后面加上'f'或'F',即float f = 3.5f;
byte a=3
  之所以不会出错原因是:前面分析跟上述一个道理,但是 byte和int之间可以相互进行隐式转换,只要a=3中的3这个数在byte的数据范围内,就会进行隐式转换,所以3已经自动转换成byte了,所以不会报错!
   注意:是3转换成byte类型,而不是a转换成int类型,a的类型已定义好了,不会再变

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
这是一个关于自动类型转换的问题,float不能自动转换为double,而byte可以自动转换为int。
简而言之:
自动类型转换可以从表示范围小的向表示范围大地转换, 比如:char,byte,short都自动转换为int
而从表示范围大的向表示范围小的转换就需要强制类型转换了,比如float t = 3.5L;

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
李明 发表于 2011-12-11 14:06
int b=1;
                byte a=b;//为什么这个就会报错?

我上面说过了啊!byte a=3中,因为byte和int之间可以相互进行隐式转换,所以不会报错!哦!对,还有我刚才说错了一点,说反了,应该是3转换成byte了,不是byte转int!它们之间是隐式转换!
回复 使用道具 举报
吴上储 黑马帝 2011-12-11 14:54:37
7#
李明 发表于 2011-12-11 14:06
int b=1;
                byte a=b;//为什么这个就会报错?

int  b = 1; 是属于int类型的
a=b ;就是把b的值赋给a a也就成了int型
byte a=b; 就是说我这个a是byte型的 上面却被转成了int 类型 所以会报类型转换错误, 损失精度。
如果byte a= (byte)b; 就对了 可以理解为 告诉编译器 我不管损失不损失精度,后果我负责。

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马