您的位置:程序门 -> java -> j2se / 基础类



我真笨,这个问题都想不通,请大家进来帮忙看一下.


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


我真笨,这个问题都想不通,请大家进来帮忙看一下.[已结贴,结贴人:longyuxinxinxin]
发表于:2007-07-18 20:15:19 楼主
class   a
{
public   static   void   main(string   args[])
{
byte   a=3*3;//不提示精度丢失,难道在运算的时候没有自动转换为int型?
byte   b=3;
byte   b=b*3;//提示精度丢失,此时运算的时候怎么会自动转换成int型?
}
}
发表于:2007-07-18 20:54:541楼 得分:1
学习
发表于:2007-07-18 21:18:182楼 得分:1
估计有一个模糊精度的概念,当3*3的时候,两个3的精度都是比较模糊的概念,当其结果赋值给byte时,就是byte的精度了。而用byte类型的值*3时,就会认为是用byte*int,最后向高精度转换为int值。最后导致提示精度丢失!
以上是我的估计。。
发表于:2007-07-19 00:45:093楼 得分:1
根据你定义类型时的数据如果不参加运算会自动兼容,但你第7行进行运算后面的数值会成为标准的int型,所以会出现这种情况(定义属性名重复,下次注意).
发表于:2007-07-19 03:02:564楼 得分:1
1、duplicate   local   variable   b

2、cannot   convert   from   int   to   byte

发表于:2007-07-19 04:55:555楼 得分:1
学习
发表于:2007-07-19 09:03:506楼 得分:1
b*3,   高精度的数据无法隐式的转成高精度的
发表于:2007-07-19 09:56:227楼 得分:1
byte   a=3*3;//这一句自动计算出了3*3值   ,如果你写成128*1他也是报错的
byte   b=3;
byte   b=b*3//这一句因为用了变量,所以没有算出值,3是int,所以b*3的值是int敷给b时会报错
发表于:2007-07-19 11:20:588楼 得分:1
确实是一个问题。不错,学习!
发表于:2007-07-19 16:13:429楼 得分:0
class     a    
{    
                      public     static     void     main(string     args[])    
                      {    
                                              byte     a=3*3;//不提示精度丢失,难道在运算的时候没有自动转换为int型?    
                                              byte     b=3;    
                                              byte     c=b*3;//提示精度丢失,此时运算的时候怎么会自动转换成int型?    
                      }    
}
发表于:2007-07-19 16:33:3510楼 得分:1
byte   站用一个字节空间,表示范围:0-255
byte   a   =   3*3;
这个时候a   站用一个字节空间。值为就,并没有出现越界的现象;
byte   b   =   3;
a   =   b*3;   b多站用的空间为int类型,让int   类型的字节空间缩减为byte类型示为不安全,会导致时局丢失;
发表于:2007-07-19 16:36:2611楼 得分:1
首先3只是一个字面值,如果说按照你的想法的话,那么就是3为int类型了?呵呵,谁规定的啊?
发表于:2007-07-19 16:38:2612楼 得分:1
对不起,错字一打堆,呵呵。
发表于:2007-07-19 17:29:3813楼 得分:1
这个问题要怎么说呢?你要知道byte   a=3*3;这一句在编译器眼里就是byte   a=9;你只要后面的计算值在-128~127之间,就不会报错。你写成byte   a=127*1   和byte   a=128*1就应该懂   了。
byte   b=a*3;这一句错的原因其实是编译器从安全的角度来看,是不会通过的。你不要想其他,就是从数学的角度这样表达安全吗?所以在运行a*3的时候就要把结果保存为int.再赋值的时候就会错
发表于:2007-07-19 17:33:5714楼 得分:0
楼上的真的意思?你说: "你不要想其他,就是从数学的角度这样表达安全吗?所以在运行a*3的时候就要把结果保存为int.再赋值的时候就会错 "
谁规定的保存为int哪本书有写?为什么不保存为double.

算了,我不是给孙鑫老师打电话问一吧,有结果我再发出来,
发表于:2007-07-19 17:45:3515楼 得分:1
与   don_juan   说的一致,由于   3   是   int   类型的,与   b   相乘后也就转型成了   int   类型,只要改成

b   =   (byte)   (b*3);   或   b   *=   3;   就可以了。
发表于:2007-07-19 20:24:4616楼 得分:7
有问题用javap

c:\java> javap   -c   test
compiled   from   "test.java "
class   test   extends   java.lang.object{
test();
    code:
      0:       aload_0
      1:       invokespecial       #1;   //method   java/lang/object. " <init> ":()v
      4:       return

public   static   void   main(java.lang.string[]);
    code:
      0:       bipush     9
      2:       istore_1
      3:       iconst_3
      4:       istore_2
      5:       iload_2
      6:       iconst_3
      7:       imul
      8:       istore_3
      9:       return

}

正如don_juan同学说的byte   a=3*3;这一句在编译器眼里就是byte   a=9;

可能是编译器优化的结果
发表于:2007-07-19 20:40:3117楼 得分:0
有道理,
发表于:2007-07-19 20:40:4418楼 得分:0
结帐


快速检索

最新资讯
热门点击