Auf Überlauf prüfen

Status
Nicht offen für weitere Antworten.

Jenny

Mitglied
Hallo Leute,
Wie prüfe ich am geschicktesten ob bei einer Differenz bzw. Addition von zwei Ganzahltypen (long, integer) ein Überlauf geschieht? Was ich im Forum zum Thema gefunden habe war ein ziemliches Kuddelmuddel. Ist doch aber ein Problem das dauernd auftritt. Dafür müsste es doch eigentlich eine Standartlösung geben, oder?

schöne Grüße
 

ARadauer

Top Contributor
ist a + b > max?

wenn(max - a) < b
dann wäre es soweit oder?
Java:
public class Test {


   public static void main(String[] args) {
   int a = 2147483647;
   int b = 100;
   
   System.out.println(ueberlauf(a, b));
      

   }
   
   public static  boolean ueberlauf(int a, int b){
      return ((Integer.MAX_VALUE-a) < b);
   }
   
  
}
 

Jenny

Mitglied
Das mit dem Overflow-flag ist mir für den Moment zu hoch. Die Lösung von ARadauer berücksichtigt leider nicht negative Werte. Also erst kucken ob negativ oder ob beide negativ - nee, welcher operand negativ ist und dann entsprechend?
 

Landei

Top Contributor
Der Aufwand der Überprüfung lohnt sich meistens nicht, denn im Allgemeinen kann man ja abschätzen, in welcher Größenordnung sich die Werte bewegen.

Wenn du Angst hast, dass ints überlaufen, nimm longs.
Wenn du Angst hast, dass longs überlaufen, nimm BigInteger.
Wenn du Angst hast, dass BigIntegers überlaufen, suche einen Psychater deines Vertrauens auf, denn dann bist du paranoid...
 

ice-breaker

Top Contributor
K, also welche Fälle haben wir:
  1. a = pos, b = pos, Überlauf bei: neg. Wert
  2. a = pos, b = neg, Überlauf bei: abhängig von den Werten ;)
  3. a = neg, b = pos, Überlauf bei: abhängig von den Werten ;)
  4. a = neg, b = neg, Überlauf bei: pos. Wert

Nun betrachten wir was bei Fall 2 passiert:
  1. a > abs(b), kein Überlauf möglich
  2. a < abs(b), es gibt einen Überlauf

Fall3:
kann auf Fall 4 abgebildet werden indem a mit b vertauscht wird
 
Zuletzt bearbeitet:

Painii

Bekanntes Mitglied
  1. a = pos, b = neg, Überlauf bei: abhängig von den Werten
  2. a = neg, b = pos, Überlauf bei: abhängig von den Werten

Ich nehme an du willst beide wieder in den gleichen Datentyp packen (also nicht int = long+long, sondern int=int+int).
Dann kann hier doch kein Überlauf auftreten.
wäre a+(-abs(b))>max, dann müsst ja schon a>max+abs(b)-> a>max, was nicht geht.
Genauso umgekehrt indem man a und b vertauscht.
Ist also einer der beiden negativ und der andere positiv kannst du eigentlich keinen Überlauf erzeugen.

Bei beiden positiv oder beiden negativ wie ice-breaker gesagt hat.

Oh, und natürlich mit int signed, sonst würde das von ice-breaker auch gelten weil ja dann a=1, b=-2 a+b=-1 wäre und -1 bei unsigned ja wieder irgendwo ganz groß ist.
 

ice-breaker

Top Contributor
Ist also einer der beiden negativ und der andere positiv kannst du eigentlich keinen Überlauf erzeugen.

ach sorry, ich habe zu weit gedacht :oops:
meine Regeln galten dafür, wann die Zahl neg. wird

Oh, und natürlich mit int signed, sonst würde das von ice-breaker auch gelten weil ja dann a=1, b=-2 a+b=-1 wäre und -1 bei unsigned ja wieder irgendwo ganz groß ist.
Java kennt doch nur signed-Datentypen, oder hab ich was verpasst ???:L
 

Jenny

Mitglied
Die Regeln für 2 und 3 gelten aber durchaus bei der Differenz.

a = pos, b = pos, Überlauf bei: nicht möglich
a = pos, b = neg, Überlauf bei: abhängig von den Werten
a = neg, b = pos, Überlauf bei: abhängig von den Werten
a = neg, b = neg, Überlauf bei: nicht möglich
 
S

Spacerat

Gast
bis einschliesslich int funktioniert folgendes... (Beispiel mit Byte)
Java:
byte xb = 127;
byte yb = 127;
short xs = (short) (xb & 0xff);
short ys = (short) (yb & 0xff);
short es = xs + ys;
boolean overflow = (es & 0x100) != 0;
Die anzahl der f's ändert sich natürlich von datentyp zu datentyp.
Allgemein kann man aber auch mit isolierten N-Flags arbeiten (Beispiel mit Byte).
Java:
byte xb = 127;
byte yb = 127;
boolean carry = ((xb & 0x80) ^ (yb & 0x80)) != 0;
byte eb = xb + yb;
boolean overflow = carry ^ ((eb & 0x80) != 0);
 
Zuletzt bearbeitet von einem Moderator:

Ark

Top Contributor
Ist das nicht etwas am Thema vorbei? Immerhin geht es hier auch um long, und da wird es schwierig, mal eben einen größeren Datentyp zu finden (außer BigInteger, blabla). Hochsprachen haben gegenüber Assemblern eben doch einige Nachteile. ^^

Ark
 
S

Spacerat

Gast
der erste Teil vllt. Der 2. Teil dagegen funktioniert ohne Bit-Expansion und daher auch bei long. Vllt. hätte ich deswegen auch long im 2. Beispiel verwenden sollen. Das ist mir im übrigen auch erst viel später eingefallen. Ich hol das mal nach
Java:
long xl = Long.MAX_VALUE;
long yl = Long.MAX_VALUE;
boolean carry = ((xl & 0x8000000000000000L) ^ (yl & 0x8000000000000000L)) != 0;
long el = xl + yl;
boolean overflow = carry ^ ((el & 0x8000000000000000L) != 0);
...seht ihr? Schon viel unübersichtlicher ;).
 
Zuletzt bearbeitet von einem Moderator:

DrZoidberg

Top Contributor
Funktioniert aber leider nicht.

[Java]
byte xb = -1;
byte yb = -1;
boolean carry = ((xb & 0x80) ^ (yb & 0x80)) != 0;
byte eb = (byte)(xb + yb);
boolean overflow = carry ^ ((eb & 0x80) != 0);
System.out.println(overflow);
[/Java]

Da kommt true raus.
 
S

Spacerat

Gast
...und Bauz... da hätte mich doch fast einer erwischt.
Ok... überredet... hier die letzten 2 Versionen:
short:
Java:
short xs = -1;
short ys = -1;
boolean carry = ((xs & 0x8000) ^ (ys & 0x8000)) != 0;
short es = (short) (xs + ys);
boolean overflow = carry ^ ((es & 0x8000) != 0);
int:
Java:
int xi = -1;
int yi = -1;
boolean carry = ((xi & 0x80000000) ^ (yi & 0x80000000)) != 0;
short ei = xi + yi;
boolean overflow = carry ^ ((ei & 0x80000000) != 0);
Mit char würde das im übrigen auch gehen. Hab' ich aber weggelassen, da es
1. das gleiche wäre wie bei short.
2. unlogisch wäre, wenn man bedenkt, das man mit Zeichen eigentlich nicht rechnen kann (a+b bleibt a+b und wird nicht 195 oder sowas ;) ).
3. char hat, wenn man es genau nimmt, kein Negativ-Flag.

@Edit: Mom... faktisch hat mich da jemand sogar erwischt... Die Berechnung von overflow muss ja vom Carry-Flag abhängig gemacht und nicht damit verknüpft werden :oops:
Java:
boolean overflow = (!carry)? (eb & 0x80) != (xb & 0x80) : false;
...gut das es Leute gibt, die einem nicht gleich immer alles glauben.
@Edit 2: Ich glaub' 'nu habbichs.
 
Zuletzt bearbeitet von einem Moderator:
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
SHasteCode Datentypen Überlauf primitiver Datentypen Java Basics - Anfänger-Themen 4
K Überlauf Java Basics - Anfänger-Themen 13
B JAVA Datentypen/Überlauf Java Basics - Anfänger-Themen 4
T Überlauf? Java Basics - Anfänger-Themen 9
J Überlauf verhindern Java Basics - Anfänger-Themen 4
V Überlauf Fakultät Java Basics - Anfänger-Themen 4
O Überlauf durch Multiplikation Java Basics - Anfänger-Themen 7
D Wie kann man in Java nach Arrays auf Duplikate prüfen Java Basics - Anfänger-Themen 12
J Schlüsselworte Prüfen, ob ein bestimmtes, ganzes Wort in einem String enthalten ist. Java Basics - Anfänger-Themen 6
Ostkreuz Int Scanner auf Enter Eingabe prüfen Java Basics - Anfänger-Themen 4
S Prüfen ob ein zweidimensionales Array rechteckig ist Java Basics - Anfänger-Themen 4
M Prüfen on eine Zahl im String enthalten ist Java Basics - Anfänger-Themen 3
ravenz Schleife mit for über String Array „zahlen“und prüfen ob Wert „a“ oder „b“ oder „c“ entspricht (mittels || ) Java Basics - Anfänger-Themen 4
Fiedelbambu Prüfen von Komma stelle beim Taschenrechner Java Basics - Anfänger-Themen 5
sserio Prüfen, ob eine Zahl eine periodische Zahl ist Java Basics - Anfänger-Themen 20
I Auf vollen Monat prüfen? Java Basics - Anfänger-Themen 22
A Dateiname auf Vorkommen prüfen Java Basics - Anfänger-Themen 29
I Prüfen, ob Anzahl an Monate ein Jahr ergeben Java Basics - Anfänger-Themen 4
K Warum gibt mir z. B. 40^128 eine Zahl? Ich dachte mit xor kann man nur booleanwerte erhalten, also prüfen ob etwas whar oder falsch ist? Java Basics - Anfänger-Themen 1
W Klasse existiert prüfen Java Basics - Anfänger-Themen 5
Q Prüfen ob Zahl als Summe von Potenzen dargestellt werden kann. Java Basics - Anfänger-Themen 20
U Kann man bei Java gleich mehrere Bedingungen prüfen in der If, aber in einem "Satz"? Java Basics - Anfänger-Themen 1
O Ich ahbe einen char und diesen soll ich bei .matches prüfen, also ob der char in meiner Zeichenkette vorhanden ist, wie mache ich das? Java Basics - Anfänger-Themen 9
B Array nach Wert prüfen rekursiv Java Basics - Anfänger-Themen 5
G Strings auf Gleichheit prüfen - Aufgabe vom Prof. Java Basics - Anfänger-Themen 5
M Array auf Primzahlen prüfen Java Basics - Anfänger-Themen 7
K Wie String prüfen ob drei mal das gleiche Zeichen vorkommt? Java Basics - Anfänger-Themen 7
J ArrayList auf bereits vorhanden eintrag prüfen Java Basics - Anfänger-Themen 5
X Zwei Dimensionales Array prüfen Java Basics - Anfänger-Themen 1
B Prüfen, ob Zeit Überschreitung Java Basics - Anfänger-Themen 2
B Sudoku prüfen Java Basics - Anfänger-Themen 13
M Prüfen auf null ohne NPE Java Basics - Anfänger-Themen 1
X Array auf Leerstellen prüfen Java Basics - Anfänger-Themen 1
FelixN Prüfen, ob ein 2D-Array rechteckig ist Java Basics - Anfänger-Themen 42
C Erste Schritte JComboBox Einträge auf Duplikat prüfen Java Basics - Anfänger-Themen 4
M prüfen ob alle array werte gleich sind Java Basics - Anfänger-Themen 27
C Array auf Null-Inhalte prüfen Java Basics - Anfänger-Themen 9
B Prüfen, ob Country Code in Europa ist? Java Basics - Anfänger-Themen 24
L Prüfen ob Fax (Tif-Datei) vollständig angekommen ist Java Basics - Anfänger-Themen 15
O Datenstruktur auf SET prüfen in O(n) Java Basics - Anfänger-Themen 32
O Einzelne Bits umwandeln und prüfen Java Basics - Anfänger-Themen 23
U Mehrfacheingabe auf bestimmte Parameter prüfen Java Basics - Anfänger-Themen 8
B Prüfen, ob Datum2 der gleiche Tag ist wie Datum1 Java Basics - Anfänger-Themen 10
Dimax Erste Schritte String Eingabe Prüfen Java Basics - Anfänger-Themen 11
S char auf buchstabe/zeichen prüfen Java Basics - Anfänger-Themen 1
S Array doppelter Wert prüfen Java Basics - Anfänger-Themen 7
B Prüfen, ob es schon einen Termin gibt in einem Zeitraum Java Basics - Anfänger-Themen 5
K Linux Speicherplatz mit Java prüfen Java Basics - Anfänger-Themen 4
O Array nach gleichen Zahlen prüfen und ausgeben Java Basics - Anfänger-Themen 6
G Compiler-Fehler Auf Anagramm prüfen Java Basics - Anfänger-Themen 1
B Excel File einlesen und Überschrift prüfen Java Basics - Anfänger-Themen 8
DaCrazyJavaExpert Input/Output Prüfen wie oft etwas eingegeben wurde Java Basics - Anfänger-Themen 2
K Operatoren 2D Int Array auf Null-Referenzen prüfen Java Basics - Anfänger-Themen 18
S Prüfen ob Zelle in Excel leer ist funktioniert nicht (Apache POI) Java Basics - Anfänger-Themen 18
C Klassen Reguläre Ausdrücke auf Gleichheit prüfen Java Basics - Anfänger-Themen 5
M Erste Schritte Java prüfen ob eine der Möglichkeiten erfüllt ist Java Basics - Anfänger-Themen 2
R Auf Nachkommastellen prüfen. Java Basics - Anfänger-Themen 2
P Argumente auf plausibilität prüfen... Java Basics - Anfänger-Themen 8
F LimitedQueue auf Datum prüfen Java Basics - Anfänger-Themen 6
B Passwort prüfen bis eindeutig - while Schleife? Java Basics - Anfänger-Themen 11
Tommy Nightmare Variable auf mehrere Ungleichheiten prüfen Java Basics - Anfänger-Themen 18
B String mit Emailadresse prüfen Java Basics - Anfänger-Themen 11
E 2D Arrays auf Ungleichheit prüfen! Java Basics - Anfänger-Themen 5
MrSnake Prüfen ob TitledPane schon besteht Java Basics - Anfänger-Themen 2
B Serial Key prüfen -> String mit privatem Key und dann abgleichen; Summe = 0 Java Basics - Anfänger-Themen 8
N Compiler-Fehler Iban prüfen Java Basics - Anfänger-Themen 7
J Prüfen ob Arrays nur mit einem Wert belegt sind Java Basics - Anfänger-Themen 3
M String prüfen Java Basics - Anfänger-Themen 7
E Prüfen ob Sammlung gesetzt wurde - Lebensmittelsammlung Java Basics - Anfänger-Themen 8
H Zufällig generierte Zahlen auf Eingabe prüfen Java Basics - Anfänger-Themen 5
S Prüfen ob bestimmter Ordner geöffnet ist (Windows XP) Java Basics - Anfänger-Themen 5
Ruvok Prüfen ob bestimmtest Element existiert im Array Java Basics - Anfänger-Themen 11
DeVolt Java8 Paket Time: Datum prüfen / try-catch Java Basics - Anfänger-Themen 1
W char-Array auf bestimmte Zeichen prüfen Java Basics - Anfänger-Themen 10
S String auf Pallindromeigenschaft prüfen Java Basics - Anfänger-Themen 15
AssELAss Datums-Objekt prüfen ob im gleichen Monat? Java Basics - Anfänger-Themen 5
Screen Input/Output Wie prüfen ob Stream1 in Stream2 enthalten ist (on-the-fly) ? Java Basics - Anfänger-Themen 5
P Seite auf Inhalt prüfen Java Basics - Anfänger-Themen 2
I Prüfen ob Webseite existiert Java Basics - Anfänger-Themen 3
Z Inputs prüfen Java Basics - Anfänger-Themen 6
G Textdatei auf Dubletten prüfen Java Basics - Anfänger-Themen 8
I Prüfen von zwei Listen Java Basics - Anfänger-Themen 1
K zwei Rechtecke auf Berührung prüfen Java Basics - Anfänger-Themen 2
G String auf Format prüfen Java Basics - Anfänger-Themen 3
J Eingabewert übergeben und prüfen von showInputDialog Java Basics - Anfänger-Themen 4
L 6stellige Zufallszahlen erzeugen & auf einzigartigkeit prüfen Java Basics - Anfänger-Themen 3
S Array befüllen & auf doppelte werte prüfen Java Basics - Anfänger-Themen 6
M Prüfen, ob Zeichen eine Zahl ist Java Basics - Anfänger-Themen 3
M Punkt auf eine Farbe prüfen Java Basics - Anfänger-Themen 8
C Datentypen Prüfen of eine Zahl Quadratzahl ist Java Basics - Anfänger-Themen 2
K Eindimensionalen Array prüfen Java Basics - Anfänger-Themen 5
M Konstruktor auf null prüfen, Arrays Java Basics - Anfänger-Themen 9
O Prüfen ob ein String den selben Namen hat wie eine Booleanreihe? Java Basics - Anfänger-Themen 17
J Arrays prüfen und über if Bedingung ausgeben Java Basics - Anfänger-Themen 15
B Interface Generics: prüfen ob Interface deklariert wird Java Basics - Anfänger-Themen 18
L Erste Schritte Einträge in ArrayList prüfen Java Basics - Anfänger-Themen 4
S OOP long prüfen Java Basics - Anfänger-Themen 5
H Prüfen, ob jpg image schon vorhanden ist, bevor es geladen wird Java Basics - Anfänger-Themen 13
L Eine ArrayList auf gleiche Inhalte prüfen Java Basics - Anfänger-Themen 10
Rayo Eingelesene Ascii Zahlen wie normale Zahlen prüfen Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben