Java und dessen Schwächen

Informatik Elektrotechnik erstes Semester: Wertebereich eines Datentyps herausfinden.

Dabei geht es darum, einen Überlauf zu finden. Binär wird ein Byte folgendermaßen dargestellt:
BIN.......DEC
00000000....0
01111111..127
10000000..128 (-128)


Bei der Binäraddition von 127+1 wird das most significant bit auf 1 gesetzt, was immer eine negative Darstellung der Zahl im Zweierkomplement bedeutet.

Um einen Überlauf zu verhindern, wird in C ein Datentyp als unsigned definiert, das heißt vorzeichenlos. unsigned Datentypen sind immer positiv.
Jetzt hat Java aber keine vorzeichenlose Datentypen. Gleich zu Beginn lässt sich demzufolge eine klare Unterlegenheit der Sprache Java gegenüber C erkennen.

Code zur Ausgabe des letzten möglichen positiven Wertes vor einem Überlauf des Integer-Datentyps:

C

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char **argv)
{
    int last, i = 1;
    while((last = i) && (++i > 0)){};
    printf("Integer overflow nach: %i\n", last);
    getchar(); // pause
    return EXIT_SUCCESS;
}



Java

import java.io.*;

public class Overflow
{
    public static void main(String args[]) throws IOException
    {
        int last = 0, i = 1;
        while(++i > 0)
        {
            last = i;
        }

        System.out.println("Integer Overflow nach: " + last);
    }
}


Man beachte die fett markierten Bereiche.

Mit Java ist der C Teil so nicht durchführbar:
Overflow.java:8: error: bad operand types for binary operator '&&'
                while((last = i) && (++i > 0)){};
                                ^
    first type: int
    second type: boolean
1 error

Es darf in der Bedingung einer while-Schleife keine Zuweisung erfolgen.

Die Ausgabe ist jeweils identisch:
Integer overflow nach: 2147483647

Diese Zahl ist gleich 231-1.

Für Bitoperationen würde ich ganz klar C bevorzugen.
((n >> k) & 1) - Gibt von Zahl n Bit Nr. k zurück. (0=LSB);