【问题标题】:Byte typecasting in javajava中的字节类型转换
【发布时间】:2013-07-29 06:55:26
【问题描述】:

程序给了我精度误差的损失,但我想不出任何精度损失,因为数字很小

这是代码##

 class Demo  
 {  
   public static void main(String args[])  
   {  
      byte b1=3;  
      byte b2=2;  
      byte b3=b1+b2;  
      System.out.println(b3);  
   }  
 }

【问题讨论】:

  • 这可以编译吗?为什么不直接使用int
  • SO 的第一条规则:如果您有错误消息或堆栈跟踪,请将它们包含在您的帖子中(使用代码格式)。如果您有输出,请将其与输入和预期输出一起包含在您的帖子中。另请阅读FAQHow to Ask
  • 这个例子直接来自 OCJP java book..解决方案甚至包括在内..

标签: java type-conversion byte add


【解决方案1】:

加法表达式b1 + b2 的类型为int - 没有在比int 更小的类型上定义任何加法运算符。所以为了将它转换回byte,你必须转换:

byte b3 = (byte) (b1 + b2);

请注意,尽管 碰巧知道这些值很小,但编译器并不关心您在前两行中设置的值 - 它们都可能是 100知道。同样,尽管知道您尝试分配给byte 变量的int 只是将两个byte 值相加的结果(或者更确切地说,是从@987654329 提升的两个值@ 到 int),整个表达式只是 int,就语言而言可能来自任何地方。

(加法可能溢出的事实是另一回事,但这将是一个不一致的论点 - 毕竟,您可以将两个 int 值相加并将结果存储在一个 int 变量中,即使加法很容易溢出。)

【讨论】:

    【解决方案2】:

    因为 127 是字节的最后一个值。 假设 b1 = 127 且 b2 = 2

    现在发生了什么 b = b1+b2 = 129 [超出字节范围,即在 int 范围内]

    现在如果你将它转换为 b = (byte)(b1+b2),你将得到 -127,这是由于将值四舍五入为字节。

    【讨论】:

      【解决方案3】:
          byte b1=3;
          byte b2=2;
          byte b3=b1+b2;  // you can't use byte here, Every time addition will result 
                           int value
      

      因为,如果您尝试转换大于字节范围的 int,则该值会丢失部分。所以加法不允许在这里使用字节。

      【讨论】:

        【解决方案4】:

        当你做 +,-,*,/,% java内部使用了一个函数

        ex: max(int,操作数1的数据类型,操作数2的数据类型);

        在您的代码中
        max(int, byte,byte) ==> 哪个更大? ==> int 更大

        所以你可能会失去压力
        找到:int

        必需:字节

        另一个例子

         short a =10;
         byte b=20;
         short c = a+b;
        

        现在:

        内部:max(int,OP1,OP2);

        即 max(int,short,byte) ==> 哪个数据类型更大? int

        所以java除外int

         int c = a+b;  (works fine)  
        

        另一个例子:

         long a =10;
         byte b=20;
         short c = a+b;
        

        现在:

        内部:max(int,OP1,OP2);

        即 max(int,long,byte) ==> 哪个数据类型更大?

        所以java除外long

         long c = a+b;(works fine)  
        

        另一个例子:

        byte b = 10;
        b = b+1;  
        

        现在,
        max(int,byte)==> 哪个数据类型更大? int
        所以,

        int c = b+1;(works fine) or b = (byte) b+1;
        

        希望你能理解

        【讨论】:

          猜你喜欢
          • 2014-12-15
          • 1970-01-01
          • 2012-05-12
          • 1970-01-01
          • 1970-01-01
          • 2021-08-09
          • 1970-01-01
          • 2017-05-30
          • 1970-01-01
          相关资源
          最近更新 更多