阿德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;
}
