Ganzzahlige Darstellung in Java [] (Ganzzahlige Darstellung in Java), Lektion, Seite 723086
https://www.purl.org/stefan_ram/pub/ganzzahlige_darstellung_java (Permalink) ist die kanonische URI dieser Seite.
Stefan Ram

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

Seiteninformationen und Impressum   |   Mitteilungsformular  |   "ram@zedat.fu-berlin.de" (ohne die Anführungszeichen) ist die Netzpostadresse von Stefan Ram.   |   Eine Verbindung zur Stefan-Ram-Startseite befindet sich oben auf dieser Seite hinter dem Text "Stefan Ram".)  |   Der Urheber dieses Textes ist Stefan Ram. Alle Rechte sind vorbehalten. Diese Seite ist eine Veröffentlichung von Stefan Ram. Schlüsselwörter zu dieser Seite/relevant keywords describing this page: Stefan Ram Berlin slrprd slrprd stefanramberlin spellched stefanram723086 stefan_ram:723086 Ganzzahlige Darstellung in Java Stefan Ram, Berlin, and, or, near, uni, online, slrprd, slrprdqxx, slrprddoc, slrprd723086, slrprddef723086, PbclevtugFgrsnaEnz Erklärung, Beschreibung, Info, Information, Hinweis,

Der Urheber dieses Textes ist Stefan Ram. Alle Rechte sind vorbehalten. Diese Seite ist eine Veröffentlichung von Stefan Ram.
https://www.purl.org/stefan_ram/pub/ganzzahlige_darstellung_java