黑马程序员技术交流社区

标题: 一个装着byte的int转换为byte再转回int就不一样了呀 [打印本页]

作者: 戴振良    时间: 2012-4-4 16:57
标题: 一个装着byte的int转换为byte再转回int就不一样了呀
  1. public class CharsetTest {
  2.        
  3.         public static void main(String[] args) throws Exception {

  4.                 int ch = 0;
  5.                 byte buf[] = new byte[1024];
  6.                 int pos = 0;
  7.                 System.out.print("请输入中文字符:");
  8.                
  9.                 while(true) {
  10.                         ch = System.in.read();//读取一个字节的内容保存到int型变量ch中
  11.                         System.out.println(Integer.toHexString(ch));--------------------------》代码1
  12.                         buf[pos++] = (byte)ch;                                       
  13.                         //System.out.println(Integer.toHexString(    (int)buf[pos-1])   );-------》代码2
  14.                 }               
  15.         }       
  16. }
复制代码
注释代码2,运行结果如下:                    注释代码1,显示代码2,运行结果如下:

                         d6                                                                                               ffffffd6
                                            d0                                                                                               ffffffd0
                                            b9                                                                                               ffffffb9
                                            fa                                                                                                fffffffa
                                            d                                                                                                 d
                                            a                                                                                                 a
为什么我把int转了一下byte,再转回int,“中国”的结果就变了,而回车与换行的结果却没有变(d,a),这是为什么呢?{:soso__11729231545393854982_2:}
作者: 贠(yun)靖    时间: 2012-4-4 17:11
损失精度了    低位像高位转换  是不会损失精度的  高位像低位强制转换 很有可能损失精度
  比如   double  1.1   强制转换成  int  的 就成 1了      1 再转回double 就成1.0了
作者: 刘士    时间: 2012-4-4 17:32
这是一个精度的问题,在byte装入int时会转换成int型。
但是如果你把int强制转换成byte时会损失精度,会把高位存入byte里面,低位抛弃。
作者: 戴振良    时间: 2012-4-4 20:28
贠(yun)靖 发表于 2012-4-4 17:11
损失精度了    低位像高位转换  是不会损失精度的  高位像低位强制转换 很有可能损失精度
  比如   double ...

可我的是整型转整型呀,你看我“代码1”输出的int结果:d6、d0、b9、fa、d、a,这几个数的大小都在1个字节内,我把它们转为byte,byte是完全装的下的呀,比如int型的1转换为byte后,结果还是1呀,那我把整形的d6、d0等转为byte应该也是一样的才对呀?怎么变负数了?
作者: 葛尧    时间: 2012-4-4 21:03
标题:
本帖最后由 葛尧 于 2012-4-4 21:09 编辑

{:soso_e103:}有什么问题么?

d  a 都是正数所以看起来没变
d6 d0等  在byte里面最高位是1吧,这些转换成10进制都是负数,负数扩容到int的4字节一般自动填充1的 所以你前面都是ffffff (hex)
而正数前面的二进制位都是0 可以省略不写,所以你看到d a貌似没变化,其实在int里面是以0000000d (hex) 0000000a (hex)储存的
作者: 贠(yun)靖    时间: 2012-4-4 21:50
戴振良 发表于 2012-4-4 20:28
可我的是整型转整型呀,你看我“代码1”输出的int结果:d6、d0、b9、fa、d、a,这几个数的大小都在1个字 ...

整形也是一样的啊  如果double的数  大于了int的最大的数  那么强转的时候也就损失精度了啊  
    再转回来也不能把损失的那部分找回来的      
作者: 戴振良    时间: 2012-4-5 09:16
葛尧 发表于 2012-4-4 21:03
有什么问题么?

d  a 都是正数所以看起来没变

原来如此,谢谢!!{:soso__8961432591078930798_3:}




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