黑马程序员技术交流社区

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

作者: 邹学良    时间: 2013-3-5 21:18
标题: 关于数据类型转换问题
本帖最后由 邹学良 于 2013-3-6 11:19 编辑
  1. class All
  2. {
  3. public static void main(String[] args) {
  4. float f= 1;
  5. // f = f + 1.15;
  6. f+=1.15;
  7. System.out.print(f);
  8. }
  9. }
复制代码
f = f + 1.15不能编译通过这个知道原因,只是为何f+=1.15能执行呢?

大神们,我的意思就是想知道f+=1.15在内存中怎么实现转换的?
作者: HM刘博    时间: 2013-3-5 21:25
我刚才试过了,都能编译成功,并且都能输出结果。
你在按照步骤认真地试一遍
作者: 张洪慊    时间: 2013-3-5 21:46
本帖最后由 张洪慊 于 2013-3-5 21:49 编辑

这个问题在论坛也有,请搜索下
首先知道浮点数默认为double
f=f+1.5;//f在运算时会被提升为double, f+1.5,运算结果为double, 不能放在float中 (损失精度)注意这个表达式经过两次运算 先+在赋值
f+=1.5;//+=运算符属于赋值运算符,这个表达式只进行一次赋值运算(相当于a=b);把=左右两边运算结果赋值给左边
          //JVM内部有一个自动强转动作,在这里前提是不能超出float范围
//视频上也有啊,接着往后看,别急
作者: 明锦添    时间: 2013-3-5 21:51
f = f + 1.15;  后升级为double型,再赋值给f,导致精度丢失,从而报错。
f+=1.15   这个运算符本身就曾在的,会自动转型的
作者: 彭波    时间: 2013-3-5 21:54
1.15默认是double类型 float是单精度浮点数在机内占4个字节,用32位二进制描述。 double双精度浮点数在机内占8个字节,用64位二进制描述。

例如:(1) short s = 2; s = s+4;
(2) short s = 2; s+=4;
问题是上面的这两个错了吗?
答:第(1)个错了,因为s是short型的,占两个字节,4是默认的int的型的,占4个字节;(1)中先做加法运算,在做赋值运算;显然short没有办法装下int型的;
       因此可以修改为s=(short)(s+4);即把结果强制转换为short型的。
       第(2)个是正确的,这个只做赋值运算,内部有一个转换类型动作,所以是正确的。
作者: 邹学良    时间: 2013-3-5 21:59
彭波 发表于 2013-3-5 21:54
1.15默认是double类型 float是单精度浮点数在机内占4个字节,用32位二进制描述。 double双精度浮点数在机内 ...

我也知道它是在强转,就是想弄明白它在内存中到底是怎么操作的
作者: 王亚东    时间: 2013-3-5 22:00
f+=1.15是赋值操作,类似于:
float temp= f;
f = (float)1.15;
f = temp + f;
作者: 彭波    时间: 2013-3-5 22:02
邹学良 发表于 2013-3-5 21:59
我也知道它是在强转,就是想弄明白它在内存中到底是怎么操作的

嗯,可以看七楼的,
作者: 罗海清    时间: 2013-3-5 22:04
一句话,就是+=这种符号,可以实现自动转型!




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