首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 一个BT的面试题目求教~~~ [已结贴,结贴人:showtime520]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-05 19:57:40 楼主
    short i=1;
    i=i+1;
    上面的CODE会报一个精度损失的错误,但是下面的咋不报错?
    i+=1;

    求教牛人解答~~
    50  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-05 20:01:221楼 得分:0
    那得研究下short与int的区别了
    楼主还是去查下书吧~~~
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • anqini
    • 等级:
    发表于:2008-05-05 20:09:342楼 得分:0
    i=i+1;//这个呢,我的理解是,short,byte,int,他们相加的时候会都转型为int类型,再相加!
    i+=1;//这个不是本身+1的意思吗?这个不太明白。。。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • bootupnow
    • 等级:
    发表于:2008-05-05 20:14:273楼 得分:0
    Java code
    byte i = 0; i = i + 1; // 编译错误,因为自动转换int问题而出错 byte i = 0; i += 1; // 正常编译,可以理解这是将i加上一个单位(i类型的单位)
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-05 20:24:074楼 得分:0
    这个就是运算符的问题,i+1返回值默认为int,当你用+作运算的时候如果2个编译器默认向类型比较大的转换,转换规则为byte->short->int->long
    这样i+1的返回值为int赋给一个short类型的变量当然就报错了,只有长度小的可以赋给长度大的, 反过来由于会丢失数据,所以不能处理,必须强制类型转换,但是i+=1则不同由于操作的变量只有i一个,所以就是在short类型的变量上自加所以能通过,如果让你向上的代码能够运行,你必须这样写
    i = (short)(i+1);这样就可以了,i+1返回int类型,就行了强制类型转换就能够赋值了
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-05 20:25:545楼 得分:0
    咋就没一个人敢答呢?自己先顶一下~~~~
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-05 20:27:436楼 得分:0
    我想问的就是 i+=1;为什么不报错~~i不是byte型的而是short
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-05 20:28:327楼 得分:0
    short s1 = 1; s1 = s1 + 1;有错,s1是short型,s1+1是int型,不能显式转化

    为short型。可修改为s1 =(short)(s1 + 1) 。short s1 = 1; s1 += 1正确。 
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-05 20:36:298楼 得分:0
    i+=1是short类型内部的自增
    而i=i+1是short类型加上一个int类型
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • chenhongxin
    • 等级:
    发表于:2008-05-05 20:48:439楼 得分:0
    i=i+1;//这个呢,我的理解是,short,byte,int,他们相加的时候会都转型为int类型,再相加!
    i+=1;//这个不是本身+1的意思吗?这个不太明白。。。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-05 20:50:1710楼 得分:0
    对对对就是单独的"+"出了问题,如果把语句改成这样
    short i = 1;
    i = (short)(i + 1);  //就不会报错了。这说明单独的"+"号运算,统统都会把低于四个字节的整形。
    //就是把语句改成这样i = i + i,也会报错,因为+会自动转换为int

    //i++或i+=1,都会自动的把进行(short)强制转换。
    另外。我都是过了不仅是单独的"+",就是"-"、"*"、"/"、"&"、"^"都会出现一样的情况!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-05 20:51:0511楼 得分:0
    short 不可以显示转化为 int
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-05 20:52:5412楼 得分:0
    上面有句话没说通顺,“统统都会把低于四个字节的数据强制转换为int”
    引用 10 楼 java_lover_ 的回复:
    对对对就是单独的"+"出了问题,如果把语句改成这样
    short i = 1;
    i = (short)(i + 1);  //就不会报错了。这说明单独的"+"号运算,统统都会把低于四个字节的整形。
    //就是把语句改成这样i = i + i,也会报错,因为+会自动转换为int

    //i++或i+=1,都会自动的把进行(short)强制转换。
    另外。我都是过了不仅是单独的"+",就是"-"、"*"、"/"、"&"、"^"都会出现一样的情况!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • bootupnow
    • 等级:
    发表于:2008-05-05 20:59:1013楼 得分:0
    引用 6 楼 showtime520 的回复:
    我想问的就是 i+=1;为什么不报错~~i不是byte型的而是short

    byte,short只是类型而已,对于这个问题有区别吗?呵呵。

    type i;
    i += 2;
    都是将i加上2个单位(i类型的单位)
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-05 21:04:3514楼 得分:0
    引用 4 楼 loujianchengdd 的回复:
    这个就是运算符的问题,i+1返回值默认为int,当你用+作运算的时候如果2个编译器默认向类型比较大的转换,转换规则为byte->short->int->long
    这样i+1的返回值为int赋给一个short类型的变量当然就报错了,只有长度小的可以赋给长度大的, 反过来由于会丢失数据,所以不能处理,必须强制类型转换,但是i+=1则不同由于操作的变量只有i一个,所以就是在short类型的变量上自加所以能通过,如果让你向上的代码能够运行,你必须这样写


    讲得很清楚的了,,没必要再讨论了,呵呵
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-05 21:17:4115楼 得分:0
    长见识了。呵呵
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-05 21:24:5916楼 得分:0
    我的解释是:首先,转换规则为byte->short->int->long.
    i=i+1;和i+=1; 虽然结果是一样的,
    但是i=i+1;当"i+1"这个过程发生时,编译器默认先将i给转换int了,然后在给值回short类型的i,当然报错了.(这是两个过程"转换\给值")
    而i+=1;中"+="是一个操作符,i+=1由于操作的变量只有i一个,所以就是在short类型的变量上自加.(这是一个过程"给值")


    书上这个地方都说的不怎么好,看自己怎么理解了,好象没必要抠这个,呵呵


    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-05 21:39:5117楼 得分:0
    short i=1;
    i=i+1; //在这里会类型隐式的转化,i+1成为了整形,然后又赋值给short类型,所以会损失精度

    "+="是一个操作符,i+=1由于操作的变量只有i一个,所以就是在short类型的变量上自加.(这是一个过程"给值")
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-05 23:50:5118楼 得分:40
    引用 2 楼 anqini 的回复:
    i=i+1;//这个呢,我的理解是,short,byte,int,他们相加的时候会都转型为int类型,再相加!
    i+=1;//这个不是本身+1的意思吗?这个不太明白。。。

    答:我可以明确地说:对于i+=1;你们都是自己的想像。
    我认为,这个面试题问得好啊。很基础。
    真正的原因是:JAVA语言的规范讲得很清楚,
    E1 op= E2 完全等价于:E1 = (T )((E1) op (E2)),其中:T是E1的类型。
    因此,short i=0; i += 1 完全等价于:i = (short)( i + 1)
    另外:+ 运算符最小的类型是int。即:byte , char ,short 类型的+ ,都是统统先转成int,然后再运算的。

    问一下:2楼的anqini,你说的小语种是“韩语”吗?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • bootupnow
    • 等级:
    发表于:2008-05-06 00:19:2619楼 得分:0
    引用 18 楼 jiangnaisong 的回复:
    引用 2 楼 anqini 的回复:
    i=i+1;//这个呢,我的理解是,short,byte,int,他们相加的时候会都转型为int类型,再相加! 
    i+=1;//这个不是本身+1的意思吗?这个不太明白。。。

    答:我可以明确地说:对于i+=1;你们都是自己的想像。
    我认为,这个面试题问得好啊。很基础。
    真正的原因是:JAVA语言的规范讲得很清楚,
    E1 op= E2 完全等价于:E1 = (T )((E1) op (E2)),其中:T是E1的类型。
    因此,short i=0; i += 1 …

    up飞翔,学习之!

    《The Java™ Language Specification Third Edition》原文如下,感兴趣的同学可以参考之!
    http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#5281

    BatchFile code
    15.26.2 Compound Assignment Operators A compound assignment expression of the form E1 op= E2 is equivalent to E1 = (T )((E1) op (E2)), where T is the type of E1, except that E1 is evaluated only once. For example, the following code is correct: short x = 3; x += 4.6; and results in x having the value 7 because it is equivalent to: short x = 3; x = (short)(x + 4.6);
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-06 09:08:4120楼 得分:0
    引用 17 楼 virusplayer 的回复:
    short i=1;
    i=i+1; //在这里会类型隐式的转化,i+1成为了整形,然后又赋值给short类型,所以会损失精度

    "+="是一个操作符,i+=1由于操作的变量只有i一个,所以就是在short类型的变量上自加.(这是一个过程"给值")

    同意
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-06 09:22:5021楼 得分:0
    云上飞翔 的是正解
    E1 op= E2 完全等价于:E1 = (T )((E1) op (E2)),其中:T是E1的类型。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-06 09:24:4422楼 得分:0
    up
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-06 10:05:0923楼 得分:0
    18楼,19楼回答精辟,同意!!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-06 11:36:0924楼 得分:0
    这个问题已经回答过了:
    http://topic.csdn.net/u/20070328/15/997ac129-07a9-4871-9e08-992e5f510894.html
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • anqini
    • 等级:
    发表于:2008-05-06 11:44:2225楼 得分:0
    引用 18 楼 jiangnaisong 的回复:
    引用 2 楼 anqini 的回复:
    i=i+1;//这个呢,我的理解是,short,byte,int,他们相加的时候会都转型为int类型,再相加! 
    i+=1;//这个不是本身+1的意思吗?这个不太明白。。。

    答:我可以明确地说:对于i+=1;你们都是自己的想像。
    我认为,这个面试题问得好啊。很基础。
    真正的原因是:JAVA语言的规范讲得很清楚,
    E1 op= E2 完全等价于:E1 = (T )((E1) op (E2)),其中:T是E1的类型。
    因此,short i=0; i += 1 …


    对阿~怎么了
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • frank3G
    • 等级:
    发表于:2008-05-06 11:50:2426楼 得分:0
    引用 8 楼 dgqbcht 的回复:
    i+=1是short类型内部的自增
    而i=i+1是short类型加上一个int类型
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-06 12:05:5027楼 得分:0
    这是一个非常经典的面试题目了,
    我都看过好多遍了。

    原因在于类型不统一,
    定义的是short,
    使用中却用到了int类型,
    所以导致你发生的问题。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • nisersent
    • 等级:
    发表于:2008-05-06 12:42:4428楼 得分:0
    学习......
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-06 13:05:1429楼 得分:0
    short i=1;
    i=i+1; //1是INT型的.I+1变成INT型.需要你强制转换一下.你可以把I设置成127试试
    上面的CODE会报一个精度损失的错误,但是下面的咋不报错?
    i+=1; //这个会自动转型
    求教牛人解答~~
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-06 13:23:5530楼 得分:0
    这个面试题目也够可以的
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-06 13:34:5731楼 得分:0
    长见识
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-06 14:14:1232楼 得分:0
    我感觉是这样的 i+1 的时候 其实是用short+int 结果会自动转换成int 而这时候再把int型的结果给short显然是不行的 因此就报错了
    而第2个则没有出现第1个的转化 所以可以通过
    我是这么理解的 也可能不对 大家共同学习吧
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-06 15:39:2333楼 得分:0
    +=之类的运算符隐含强制转换。
    s+=1 (==)s=(short)s+1;

    从效果还是从实质上两者是一样的
    这个东西没必要死扣
    记住了 以后碰到了明白就是了
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-06 15:45:0834楼 得分:0
    引用 4 楼 loujianchengdd 的回复:
    这个就是运算符的问题,i+1返回值默认为int,当你用+作运算的时候如果2个编译器默认向类型比较大的转换,转换规则为byte->short->int->long
    这样i+1的返回值为int赋给一个short类型的变量当然就报错了,只有长度小的可以赋给长度大的, 反过来由于会丢失数据,所以不能处理,必须强制类型转换,但是i+=1则不同由于操作的变量只有i一个,所以就是在short类型的变量上自加所以能通过,如果