Die Darstellung negativer Zahlen in Java
public final class Main { public static void main( final java.lang.String[] args ) { java.lang.System.out.println( java.lang.Integer.toBinaryString( 0 )); java.lang.System.out.println( java.lang.Integer.toBinaryString( 1 )); java.lang.System.out.println( java.lang.Integer.toBinaryString( 2 )); java.lang.System.out.println( java.lang.Integer.toBinaryString( 3 )); java.lang.System.out.println( java.lang.Integer.toBinaryString( -1 )); java.lang.System.out.println( java.lang.Integer.toBinaryString( -2 )); java.lang.System.out.println( java.lang.Integer.toBinaryString( -3 )); }}
Ausgabe manuell nachbearbeitet:
00000000000000000000000000000000 00000000000000000000000000000001 00000000000000000000000000000010 00000000000000000000000000000011 11111111111111111111111111111111 11111111111111111111111111111110 11111111111111111111111111111101
The unsigned integer value is the argument plus 2³² if the argument is negative.
11111111111111111111111111111110 + 1 = 11111111111111111111111111111111
d.h. mit der „normalen Addition“ erhält man das richtige Ergebnis: -2 + 1 = -1. Es ist kein zusätzliches Spezialprogamm für die Addition negativer Zahlen nötig. Dies ist der Vorteil dieser Darstellung, welche „Zweierkomplement“ genannt wird.
public final class Main { public static void main( final java.lang.String[] args ) { java.lang.System.out.println( java.lang.Integer.MAX_VALUE - 2 ); java.lang.System.out.println( java.lang.Integer.MAX_VALUE - 1 ); java.lang.System.out.println( java.lang.Integer.MAX_VALUE ); java.lang.System.out.println( java.lang.Integer.MAX_VALUE + 1 ); java.lang.System.out.println( java.lang.Integer.MAX_VALUE + 2 ); }} 2147483645 2147483646 2147483647 -2147483648 -2147483647 public final class Main { public static void main( final java.lang.String[] args ) { java.lang.System.out.println( java.lang.Integer.toBinaryString( java.lang.Integer.MAX_VALUE - 2 )); java.lang.System.out.println( java.lang.Integer.toBinaryString( java.lang.Integer.MAX_VALUE - 1 )); java.lang.System.out.println( java.lang.Integer.toBinaryString( java.lang.Integer.MAX_VALUE )); java.lang.System.out.println( java.lang.Integer.toBinaryString( java.lang.Integer.MAX_VALUE + 1 )); java.lang.System.out.println( java.lang.Integer.toBinaryString( java.lang.Integer.MAX_VALUE + 2 )); }}
Ausgabe manuell nachbearbeitet:
01111111111111111111111111111101
01111111111111111111111111111110
01111111111111111111111111111111
10000000000000000000000000000000 <- ab hier wird der Wert negativ dargestellt, MSB ist Vorzeichen
10000000000000000000000000000001
Ein zusätzliches Erkennen („Abfangen“) des Überlaufs würde das Programm unter Umständen bremsen. Deswegen hat man in C, C++, und dann auch in Java darauf verzichtet. Durch spezielle Prüfungen (siehe Fefe) kann ein Überlauf aber erkannt werden.
public final class Main { public static void main( final java.lang.String[] args ) { java.lang.System.out.println( java.lang.Integer.toUnsignedString( java.lang.Integer.MAX_VALUE - 2 )); java.lang.System.out.println( java.lang.Integer.toUnsignedString( java.lang.Integer.MAX_VALUE - 1 )); java.lang.System.out.println( java.lang.Integer.toUnsignedString( java.lang.Integer.MAX_VALUE )); java.lang.System.out.println( java.lang.Integer.toUnsignedString( java.lang.Integer.MAX_VALUE + 1 )); java.lang.System.out.println( java.lang.Integer.toUnsignedString( java.lang.Integer.MAX_VALUE + 2 )); }} 2147483645 2147483646 2147483647 2147483648 2147483649
Das Negative von »java.lang.Integer.MIN_VALUE« müßte größer als »java.lang.Integer.MAX_VALUE« sein, was aber in Java nicht möglich ist.
Das Negative bilden heißt im Zweierkomplement: Invertieren und 1 addieren!
Main.java
public class Main
{ public static void main( final java.lang.String[] args )
{ java.lang.System.out.println( java.lang.Integer.MIN_VALUE );
java.lang.System.out.println( -java.lang.Integer.MIN_VALUE ); }}java.lang.System.out
-2147483648
-2147483648
Zweierkomplement