C uint8_t uint16_t 轉 Java byte int


阿德0307 Java中&0xFF是什么意思?計算機的原碼、補碼和反碼

 一.定義 

1.1.定義類型

typedef   signed          char int8_t;
typedef   signed short     int int16_t;
typedef   signed           int int32_t;
typedef   signed       __INT64 int64_t;
 
/* exact-width unsigned integer types */
typedef unsigned          char uint8_t;
typedef unsigned short     int uint16_t;
typedef unsigned           int uint32_t;
typedef unsigned       __INT64 uint64_t;

 注:uint8_t實際上是一個char. 所以輸出uint8_t類型的變量實際上輸出其對應的字符,而不是數值

1.2. C范圍

符號 類型 width 最小值 最大值
signed char 8 bit -128 +127
signed short 16 bit -32 768 +32 767
signed int 32 bit -2 147 483 648 +2 147 483 647
signed long 64 bit -9 223 372 036 854 775 808 +9 223 372 036 854 775 807
unsigned char 8 bit 0 +255
unsigned short 16 bit 0 +65 535
unsigned int 32 bit 0 +4 294 967 295
unsigned long 64 bit 0 +18 446 744 073 709 551 615

1.3.Java范圍

類型 width 最小值 最大值
byte 8 bit -128 +127
short 16 bit -32 768 +32 767
int 32 bit -2 147 483 648 +2 147 483 647
long 64 bit -9 223 372 036 854 775 808 +9 223 372 036 854 775 807
char 8 bit 0 +65 535

二.(byte)強轉byte

2.1.byte(128)為什么是-128?

		int a = 128;
		int b ;

		System.out.println(Integer.toHexString(127));//7f
		b= (byte) a ;
		System.out.println(Integer.toHexString(b));//ffffff80
		System.out.println(b);//-128

2.2.在計算機系統中 數值一律用補碼來表示和存儲

正整數:原碼=反碼=補碼
負整數:負整數反碼 = 符號為1 其余各位取反
負整數的補碼 = 反碼+1 符號不變
負整數的補碼轉原碼 = 補碼減一再取反

a. 128 原碼 0000 0000 0000 0000 0000 0000 1000 0000

b.強制類型轉換為byte類型 其實就是一個強制高位截斷的過程
截斷為byte類型 結果得到為 1000 0000
   Q:欸,現在 1000 0000 的最高位是1 那么表示是一個負數
   A: 負數在計算機中都是以補碼的形式保存的

c.1000 0000 = ~1000 0000 + 1
= 0111 1111 + 1
= 1000 0000

所以10000000其真值為 0、也就是 -0 的原碼為10000000  用-0來代表最低位

2.3.Reson

byte類型的數字要&0xff再賦值給int類型 本質原因就是想保持二進制補碼的一致性

當byte要轉化為int的時候 高的24位必然會補1 這樣 其二進制補碼其實已經不一致了
&0xff可以將高的24位置為0 低8位保持原樣 這樣做的目的就是為了保證二進制數據的一致性

// CRC校驗
uint16_t Dev_CRC16(QByteArray ba)
{
    uint8_t val;
    uint16_t i, j;
    uint16_t CurVal;
    uint16_t CrcReg = 0xFFFF;
 
    for (i = 0; i < ba.size(); i++)
    {
        val = (uint8_t)ba.at(i);
        CurVal = val << 8;
 
        for (j = 0; j < 8; j++)
        {
            if ((short)(CrcReg ^ CurVal) < 0)
            {
                CrcReg = (CrcReg << 1) ^ 0x1021;
            }
            else
            {
                CrcReg <<= 1;
            }
            CurVal <<= 1;
        }
    }
 
    return CrcReg;
}



    /**
     * CRC校驗
     */
    public int Dev_CRC16(byte[] ba) {
        int val;//0xff
        int i, j;
        int CurVal;//0xffff
        int CrcReg = 0xFFFF;
 
        for (i = 0; i < ba.length; i++) {
            //uint8_t -> int
            val = ba[i] & 0xff;
            CurVal = val << 8;
 
            for (j = 0; j < 8; j++) {
                if ((short) (CrcReg ^ CurVal) < 0) {
                    CrcReg = (((CrcReg << 1) & 0xffff) ^ 0x1021);
                    //Log.d("gatsby","file_arry i-> " + i + " CrcReg -> " + CrcReg);
                } else {
                    CrcReg = (CrcReg << 1) & 0xffff;
                }
                CurVal <<= 1;
            }
        }
        return CrcReg;
    }

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM