Java無符號數據類型

Java不支持無符號數據類型。byteshortintlong都是有符號數據類型。對於有符號數據類型,值範圍的一半存儲正數,一半用於負數,因爲一個位用於存儲有符號值的符號。

例如,一個字節需要8位; 其範圍是-128``到127。如果只在一個字節中存儲正數,則其範圍將爲0255

Java在包裝器類中有一些靜態方法,以支持處理帶符號值中的位的操作,就像它們是無符號整數一樣。

Byte 類包含兩個靜態方法:

int  toUnsignedInt(byte x)
long  toUnsignedLong(byte x)

這些方法將指定的字節參數轉換爲intlong,就像該字節存儲爲無符號值一樣。如果指定的字節爲零或正,則轉換的intlong值將相同。如果參數是負數,則轉換的數字將爲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)

示例-1

以下代碼顯示瞭如何將存儲在字節中的值作爲無符號整數:

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

實例-2

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