Java不支援無符號資料型別。byte
,short
,int
和long
都是有符號資料型別。對於有符號資料型別,值範圍的一半儲存正數,一半用於負數,因為一個位用於儲存有符號值的符號。
例如,一個位元組需要8
位; 其範圍是-128``到127
。如果只在一個位元組中儲存正數,則其範圍將為0
到255
。
Java在包裝器類中有一些靜態方法,以支援處理帶符號值中的位的操作,就像它們是無符號整數一樣。
Byte
類包含兩個靜態方法:
int toUnsignedInt(byte x)
long toUnsignedLong(byte x)
這些方法將指定的位元組引數轉換為int
和long
,就像該位元組儲存為無符號值一樣。如果指定的位元組為零或正,則轉換的int
和long
值將相同。如果引數是負數,則轉換的數位將為2^8 + x
。
例如,對於輸入-10
,返回的值將是2^8 +(-10)
,也就是246
。負數以2
的二補數形式儲存。 值-10
將被儲存為11110110
。最高有效位1
表示它是一個負數。
前7位(1110110
)的2
的二補數是001010
,十進位制為10
。
如果考慮實際位11110110
,在一個位元組中作為無符號整數,其值為246(128 + 64 + 32 + 16 + 0 + 4 + 2 + 0)
。
以下程式碼顯示了如何將儲存在位元組中的值作為無符號整數:
public class Main {
public static void main(String[] args) {
byte b = -10;
int x = Byte.toUnsignedInt(b);
System.out.println("Signed value in byte = " + b);
System.out.println("Unsigned value in byte = " + x);
}
}
上面的程式碼生成以下結果。
Signed value in byte = -10
Unsigned value in byte = 246
Integer
類包含以下靜態方法以支援無符號運算和轉換:
int compareUnsigned(int x, int y)
int divideUnsigned(int dividend, int divisor)
int parseUnsignedInt(String s)
int parseUnsignedInt(String s, int radix)
int remainderUnsigned(int dividend, int divisor)
long toUnsignedLong(int x)
String toUnsignedString(int i)
String toUnsignedString(int i, int radix)
以下程式碼顯示了對兩個int
變數的除法運算,如同它們的位表示無符號值一樣:
public class Main {
public static void main(String[] args) {
// Two negative integer values
int x = -1;
int y = -2;//
// Performs signed division
System.out.println("Signed x = " + x);
System.out.println("Signed y = " + y);
System.out.println("Signed x/y = " + (x / y));
// Performs unsigned division by treating x and y holding unsigned values
long ux = Integer.toUnsignedLong(x);
long uy = Integer.toUnsignedLong(y);
int uQuotient = Integer.divideUnsigned(x, y);
System.out.println("Unsigned x = " + ux);
System.out.println("Unsigned y = " + uy);
System.out.println("Unsigned x/y = " + uQuotient);
}
}
上面的程式碼生成以下結果。
Signed x = -1
Signed y = -2
Signed x/y = 0
Unsigned x = 4294967295
Unsigned y = 4294967294
Unsigned x/y = 1