我是想把一个int按字节存储在byte里,可是复原后的数很奇怪,有时候能复原,有时候不能复原。为什么?
程序如下:
public class TEst
{
    public static void main(String[] args)
    {
        int t;
        t=456595487;
        System.out.println(t+":"+test(t));
        t=456595436;
        System.out.println(t+":"+test(t));
    }    public static int test(int t1)
    {
        int t2=0xffffffff;
        byte[] b=new byte[4];
        for(int i=0;i<4;i++)
        {
            b[i] = (byte) t1;
            t1=t1>>8;
        }
        for(int i=3;i>=0;i--)
        {
            t2=t2<<8;
            t2=t2+b[i];
        }
        return t2;
    }
}结果如下:
456595487:456595487
456595436:456595180

解决方案 »

  1.   

    我运行了结果和lz一样。我想可以与byte和int的存储空间大小有关吧~~
      

  2.   

    找到原因了:在JAVA中byte是带符号的,不像在C++中byte是不带符号的。当int强制转换给byte时,把int的低8位截给了byte,可是int的低8位很有可能是超过127的,当byte返回时把超过127的数字当成负数的补码返回,比如255返回成-1,128返回成-128,请注意:byte的模为256。所以加个判断后,可以返回真实的int值。程序如下:public class TEst
    {
        public static void main(String[] args)
        {
            int t;
            t=456595487;
            System.out.println(t+":"+byteToInt(intToByte(t)));
            t=456595436;
            System.out.println(t+":"+byteToInt(intToByte(t)));
            t=Integer.MAX_VALUE;
            System.out.println(t+":"+byteToInt(intToByte(t)));
            t=Integer.MIN_VALUE;
            System.out.println(t+":"+byteToInt(intToByte(t)));
            t=48;
            System.out.println(t+":"+byteToInt(intToByte(t)));
        }    public static int byteToInt(byte[] b) //byteToInt
        {
            int t2=0;
            for(int i=3;i>=0;i--)
            {
                t2=t2<<8;
                t2 = b[i] < 0 ? t2 + b[i] + 256 : t2 + b[i];
            }
            return t2;
        }
        
        public static byte[] intToByte(int t1) //intToByte
        {
            byte[] b=new byte[4];
            for(int i=0;i<4;i++)
            {
                b[i] = (byte) t1;
                t1=t1>>8;
            }
            return b;
        }
    }结果如下:456595487:456595487
    456595436:456595436
    2147483647:2147483647
    -2147483648:-2147483648
    48:48感谢楼上两位。
      

  3.   

    >>是算术位移,>>>是逻辑位移
      

  4.   

    hacklew1985() 
      
       
    >>是算术位移,>>>是逻辑位移  
     没看我回复的帖吗?就不关这个的事。