簡單討論資料型別(byte)強制轉化後的數值變化規律

qingyezhu發表於2013-08-10

 

 

package com.wangzhu.datatype;

/**
 * Java基本資料型別練習
 * 
 * @ClassName: DataTypes
 * @Description: TODO
 * @author wangzhu
 * @date 2013-8-10 上午11:41:31
 * 
 */
public class DataTypes {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // byte型別:資料範圍:(-2^7 ~ 2^7-1),其中(2^7 = 128)
        byte num001 = 127;
        // byte num0011 = 128;//編譯失敗,超出了該型別的資料範圍,若要將這個資料賦給該變數,則需要強制轉化
        byte num0012 = (byte) 128;
        byte num0013 = (byte) 129;
        byte num0014 = (byte) 1000;
        byte num002 = -128;
        // byte num0021 = -129;//編譯失敗,超出了該型別的資料範圍,若要將這個資料賦給該變數,則需要強制轉化

        byte num0022 = (byte) -129;
        byte num0023 = (byte) -130;
        byte num0024 = (byte) -490;
        System.out.println("num001 = " + num001 + " num0012 = " + num0012
                + " num0013 = " + num0013 + " num0014 = " + num0014
                + " num002 = " + num002 + " num0022 = " + num0022
                + " num0023 = " + num0023 + " num0024 = " + num0024);
        // num001 = 127 num0012 = -128 num0013 = -127 num0014 = -22 num002 =
        // -128 num0022 = 127 num0023 = 126 num0024 = 22
        // 從結果可以看出,當賦給的變數值超過了該型別的資料範圍時,則其會從該型別的資料範圍的最大值或最小值,加上或減去超出的部分,最後並加一或減一,結果就是該變數的值
        // 例如:本例中,num0013,其比最大值(127)大2,那麼最小值應該加上2,並減去1,故num0013 = -127
        // 例如:本例中,num0023,其比最小值(-128)小2,那麼最大值應該減去2,並加上1,故num0013 = 126
        // 但是,對於num0014,num0024,按照上述方法,計算的結果和輸出不同,其實不是的,其中還有點細節,具體如下:
        // 對於超出最大值的,則其結果必然是非正數,對於超出最小值的,則其結果必然是非負數。

        for(int i = 0 ;i < 1000;i ++){
            byte numi = (byte)i;
            int ii = test(i,127,256);
            if(!String.valueOf(ii).equals(String.valueOf(numi)))
            {
                System.out.println("i = " + i + " == " + (i - 127) + " numi = " + numi + "  ii= " + ii);
            }
        }
        for(int i = -1000 ;i < 0;i ++){
            byte numi = (byte)i;
            int ii = test(i,-128,256);
            if(!String.valueOf(ii).equals(String.valueOf(numi)))
            {
                System.out.println("i = " + i + " == " + (i + 127) + " numi = " + numi + "  ii= " + ii);
            }
        }
        //總結:對於正數,其實在下列數列中數到第i個數,就是i強制轉化的結果,該數列為:0 ~ 127,-128 ~ 0 ~ 127,-128 ~ 0 ~ 127...
        //總結:對於負數,其實在下列數列中數到第i個數,就是i強制轉化的結果,該數列為:0 ~ -128,127 ~ 0 ~ -128,127 ~ 0 ~ -128...
        
        
        
    }

    /**
     * 測試資料型別為byte時,資料超出範圍後的值的規律
     * @param num 強制轉換的值
     * @param normal 正向最大值或負向最小值
     * @param maxNum 資料範圍的大小
     * @return    測試規律的結果
     */
    public static int test(int num, int normal,int maxNum) {
        num = num % maxNum;
        int value = -1;
        if (normal > 0) {
            if(num <= normal){
                value = num;
            }else{
                value = num - normal;
                normal ++;
                value  = value - normal - 1 ;
            }
        } else {
            if(num >= normal){
                value = num;
            }else{
                value = num - normal;
                normal ++;
                value = value - normal + 1;
            }
        }
        return value;
    }

}

 

以上是本人閒暇時,根據自己所猜測的想法,實現了一下。其中想法可能不太成熟,若有錯誤,請指出,謝謝!僅供參考!

 

補充:對於int轉換為byte,就是擷取32位int的後8位,若此時的高位是1,則表明該byte是負數,否則是正數!!!強制型別轉換會丟失高位,只保留轉換型別的位數。

 

相關文章