Webサイト制作コースのお申し込みはこちら Webサイト制作コースのお申し込みはこちら

Javaにunsignedはない

JavaにはC言語のようにunsignedは用意されていません。

Long・Integerのメソッドでunsignedを実現

変数に大きな値を格納する必要がある場合は、「int型」か「long型」を使用しましょう。

各データ型に用意されているメソッドを使うことで、符号なし整数とみなして計算できます。

Java SE 8以降では、intデータ型を使って、符号なし32ビットの整数を表せます。

また、同じくJava SE 8以降でlongデータ型を使って、符号なし64ビットを表すことが可能です。

具体的に使用できるメソッドは次の通りです。

int型・long型のメソッド
  • compareUnsignedメソッド:2つのint値(long値)を符号なしとして処理して数値的に比較
  • divideUnsignedメソッド:第1引数を第2引数で除算した符号なしの商を返す。各引数と結果は符号なしの値として解釈される
  • remainderUnsignedメソッド:第1引数を第2引数で割った符号なしの余りを返す。各引数と結果は符号なしの値として解釈される
  • toUnsignedStringメソッド:引数の文字列表現を、符号なし10進値として返す
  • parseUnsignedInt(parseUnsignedLong)メソッド:文字列の引数を符号なし10進数の整数として構文解析

参考:Integer (Java Platform SE 8 )
参考:Long (Java Platform SE 8 )

それぞれのメソッドを使って動作を確認してみました。

■compareUnsignedメソッドの記述例
public class Main {
    public static void main(String[] args) {
      int x = 10, y = 10;
      System.out.println("x=yの場合:" + Integer.compareUnsigned(x, y));
      x = 10; y = 20;
      System.out.println("x<yの場合:" + Integer.compareUnsigned(x, y));
      x = 30; y = 20;
      System.out.println("x>yの場合:" + Integer.compareUnsigned(x, y));
      x = -30; y = 20;
      System.out.println("x<yの場合だが符号なしの値として比較するので「1」になる:" + Integer.compareUnsigned(x, y));
      long z = 10, w = 10;
      System.out.println("z=wの場合:" + Long.compareUnsigned(z, w));
      z = 10; w = 20;
      System.out.println("z<wの場合:" + Long.compareUnsigned(z, w));
      z = 30; w= 20;
      System.out.println("z>wの場合:" + Long.compareUnsigned(z, w));
      z = -30; w = 20;
      System.out.println("z<wの場合だが符号なしの値として比較するので「1」になる:" + Long.compareUnsigned(z, w));
    }
}
■実行結果
mbp:desktop potepan$ java Main
x=yの場合:0
x<yの場合:-1 x>yの場合:1
x<yの場合だが符号なしの値として比較するので「1」になる:1
z=wの場合:0
z<wの場合:-1 z>wの場合:1
z<wの場合だが符号なしの値として比較するので「1」になる:1
■divideUnsignedメソッドの記述例
public class Main {
    public static void main(String[] args) {
      int x = 20, y = 10;
      System.out.println("int型:x = 20, y = 10");
      System.out.println("符号ありのx/yの場合:" + x / y);
      System.out.println("符号なしのx/yの場合:" + Integer.divideUnsigned(x, y));
      x = -20; y = 10;
      System.out.println("int型:x = -20, y = 10");
      System.out.println("符号ありのx/yの場合:" + x / y);
      System.out.println("符号なしのx/yの場合:" + Integer.divideUnsigned(x, y));
      x = 20; y = -10;
      System.out.println("int型:x = 20, y = -10");
      System.out.println("符号ありのx/yの場合:" + x / y);
      System.out.println("符号なしのx/yの場合:" + Integer.divideUnsigned(x, y));
      long z = 20, w = 10;
      System.out.println("long型:z = 20, w = 10");
      System.out.println("符号ありのz/wの場合:" + z / w);
      System.out.println("符号なしのz/wの場合:" + Long.divideUnsigned(z, w));
      z = -20; w = 10;
      System.out.println("long型:z = -20, w = 10");
      System.out.println("符号ありのz/wの場合:" + z / w);
      System.out.println("符号なしのz/wの場合:" + Long.divideUnsigned(z, w));
      z = 20; w = -10;
      System.out.println("long型:z = 20, w = -10");
      System.out.println("符号ありのz/wの場合:" + z / y);
      System.out.println("符号なしのz/wの場合:" + Long.divideUnsigned(z, w));
    }
}
■実行結果
mbp:desktop potepan$ java Main
int型:x = 20, y = 10
符号ありのx/yの場合:2
符号なしのx/yの場合:2
int型:x = -20, y = 10
符号ありのx/yの場合:-2
符号なしのx/yの場合:429496727
int型:x = 20, y = -10
符号ありのx/yの場合:-2
符号なしのx/yの場合:0
long型:z = 20, w = 10
符号ありのz/wの場合:2
符号なしのz/wの場合:2
long型:z = -20, w = 10
符号ありのz/wの場合:-2
符号なしのz/wの場合:1844674407370955159
long型:z = 20, w = -10
符号ありのz/wの場合:-2
符号なしのz/wの場合:0
■remainderUnsignedメソッドの記述例
public class Main {
    public static void main(String[] args) {
      int x = 20, y = 10;
      System.out.println("int型:x = 20, y = 10");
      System.out.println("符号ありのx/yの場合:" + x / y);
      System.out.println("符号なしのx/yの場合:" + Integer.remainderUnsigned(x, y));
      x = -20; y = 10;
      System.out.println("int型:x = -20, y = 10");
      System.out.println("符号ありのx/yの場合:" + x / y);
      System.out.println("符号なしのx/yの場合:" + Integer.remainderUnsigned(x, y));
      x = 20; y = -10;
      System.out.println("int型:x = 20, y = -10");
      System.out.println("符号ありのx/yの場合:" + x / y);
      System.out.println("符号なしのx/yの場合:" + Integer.remainderUnsigned(x, y));
      long z = 20, w = 10;
      System.out.println("long型:z = 20, w = 10");
      System.out.println("符号ありのz/wの場合:" + z / w);
      System.out.println("符号なしのz/wの場合:" + Long.remainderUnsigned(z, w));
      z = -20; w = 10;
      System.out.println("long型:z = -20, w = 10");
      System.out.println("符号ありのz/wの場合:" + z / w);
      System.out.println("符号なしのz/wの場合:" + Long.remainderUnsigned(z, w));
      z = 20; w = -10;
      System.out.println("long型:z = 20, w = -10");
      System.out.println("符号ありのz/wの場合:" + z / y);
      System.out.println("符号なしのz/wの場合:" + Long.remainderUnsigned(z, w));
    }
}

■実行結果
mbp:desktop potepan$ java Main
int型:x = 20, y = 10
符号ありのx/yの場合:2
符号なしのx/yの場合:0
int型:x = -20, y = 10
符号ありのx/yの場合:-2
符号なしのx/yの場合:6
int型:x = 20, y = -10
符号ありのx/yの場合:-2
符号なしのx/yの場合:20
long型:z = 20, w = 10
符号ありのz/wの場合:2
符号なしのz/wの場合:0
long型:z = -20, w = 10
符号ありのz/wの場合:-2
符号なしのz/wの場合:6
long型:z = 20, w = -10
符号ありのz/wの場合:-2
符号なしのz/wの場合:20
■toUnsignedStringメソッドの記述例
public class Main {
    public static void main(String[] args) {
      int i = Integer.MAX_VALUE;
      System.out.println("Integer.MAX_VALUE:" + i);
      i = Integer.MAX_VALUE + 1;
      System.out.println("符号ありの場合:" + i);
      System.out.println("符号なしの場合:" + Integer.toUnsignedString(i));
      long l = Long.MAX_VALUE;
      System.out.println("Long.MAX_VALUE:" + l);
      l = Long.MAX_VALUE + 1;
      System.out.println("符号ありの場合:" + l);
      System.out.println("符号なしの場合:" + Long.toUnsignedString(l));
    }
}
■実行結果
mbp:desktop potepan$ java Main
Integer.MAX_VALUE:2147483647
符号ありの場合:-2147483648
符号なしの場合:2147483648
Long.MAX_VALUE:9223372036854775807
符号ありの場合:-9223372036854775808
符号なしの場合:9223372036854775808
■parseUnsignedInt(parseUnsignedLong)メソッドの記述例
public class Main {
    public static void main(String[] args) {
      int i01 = Integer.parseUnsignedInt("2147483647");
      System.out.println(i01);
      int i02 = Integer.parseUnsignedInt("2147483648");
      System.out.println(i02);
      long l01 = Long.parseUnsignedLong("9223372036854775807");
      System.out.println(l01);
      long l02 = Long.parseUnsignedLong("9223372036854775808");
      System.out.println(l02);
    }
}
■実行結果
mbp:desktop potepan$ java Main
2147483647
-2147483648
9223372036854775807
-9223372036854775808

どのメソッドも、符号なしで計算できているのがわかりますね。

このように、int型・long型のメソッドを活用することで、unsignedを擬似的に実現できます。

Java 9からUnsignedクラスが導入

Java 9から新しくUnsignedクラスが導入されており、値が符号なしデータ型であることを示します。

詳しくは、Javaのリファレンスを参考にしてみてくださいね。

参考:Unsigned (Java SE 9 & JDK 9 )

エンジニアになりたい人に選ばれるプログラミングスクール「ポテパンキャンプ 」

ポテパンキャンプは卒業生の多くがWebエンジニアとして活躍している実践型プログラミングスクールです。 1000名以上が受講しており、その多くが上場企業、ベンチャー企業のWebエンジニアとして活躍しています。

基礎的な学習だけで満足せず、実際にプログラミングを覚えて実践で使えるレベルまで学習したいという方に人気です。 プログラミングを学習し実践で使うには様々な要素が必要です。

それがマルっと詰まっているポテパンキャンプでプログラミングを学習してみませんか?

卒業生の多くがWebエンジニアとして活躍

卒業生の多くがWeb企業で活躍しております。
実践的なカリキュラムをこなしているからこそ現場でも戦力となっております。
活躍する卒業生のインタビューもございますので是非御覧ください。

経験豊富なエンジニア陣が直接指導

実践的なカリキュラムと経験豊富なエンジニアが直接指導にあたります。
有名企業のエンジニアも多数在籍し品質高いWebアプリケーションを作れるようサポートします。

満足度高くコスパの高いプログラミングスクール「ポテパンキャンプ」

運営する株式会社ポテパンは10,000人以上のエンジニアのキャリアサポートを行ってきております。
そのノウハウを活かして実践的なカリキュラムを随時アップデートしております。

代表の宮崎もプログラミングを覚えサイトを作りポテパンを創業しました。
本気でプログラミングを身につけたいという方にコスパ良く受講していただきたいと思っておりますので、気になる方はぜひスクール詳細をのぞいてくださいませ。