Datentypen Automatische Konvertierung

  • Themenstarter meowi1231221212
  • Beginndatum
M

meowi1231221212

Gast
Hi ich habe eine Frage. Wenn ich folgendes in einer Schleife (sagen wir von +/-500 bis 0) durchlaufen lassen,
kommen für einige Werte negative Zahlen raus. (Ja ich benutze absichtlich KEIN long Datentyp).

Code:
if((x *x * 4987142) < 0) {
     System.out.println(x);
}

Ich dachte erst, dass es etwas mit der Überschreitung des maximalen Wertes auf sich hat. Jedoch verwunderte es mich, dass es nur für manche Zahlen geschieht!?
Die Zahlen: #2334333 - Pastie


Weiß zufällig jemand eine Erklärung?
 
M

meowi1231221212

Gast
Code:
for(int x=0;x<501;x++) {
if((x *x * 4987142) < 0) {
     System.out.println(x):
}
}

Sollte jetzt ja nicht so schwer sein die Schleife darum zu schreiben.
 

turtle

Top Contributor
Scheinbar doch, weil Dein Code NICHT kompiliert.

Wo gibt das denn negative Zahlen?

21
22
23
24
25
26
27
28
29
36
37
38
39
40
41
47
48
49
50
55
56
57
58
63
64
65
69
70
71
75
76
77
81
82
83
86
87
88
91
92
96
97
100
101
104
105
108
109
112
113
116
117
120
123
124
127
130
131
133
134
137
140
143
146
149
152
154
155
157
158
160
163
165
166
168
170
171
173
175
176
178
180
183
185
187
190
192
194
196
198
199
201
203
205
207
209
211
213
215
217
219
221
223
225
227
229
231
234
236
238
240
243
245
247
249
250
252
254
255
257
259
262
264
265
267
270
272
273
275
278
281
283
284
286
287
289
290
293
296
299
300
302
303
306
309
310
313
316
317
320
321
324
325
328
329
332
333
334
337
338
342
343
347
348
352
353
354
357
358
359
364
365
366
370
371
372
373
378
379
380
381
387
388
389
390
391
398
399
400
401
402
403
404
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
457
458
459
460
461
462
463
464
470
471
472
473
474
475
480
481
482
483
488
489
490
491
495
496
497
498
 

Monaria

Aktives Mitglied
Lass die die Ergebnisse doch mal ausgeben und beachte dabei den Wertebereich für int.
Vllt. fällt dir was auf :)

@turtle: Das sind die Zahlen, bei denen negative Werte rauskommen.
 

turtle

Top Contributor
Du einen Fehler.

Ich einen Fehler. Wir sind quit.

Natürlich gibt das einen Überlauf ab 21*21*4987142
Java:
		for(int x=0;x<501;x++) {
			long y = (x *x * 4987142L);
			System.out.println("x:"+x+"="+y);
			}
 
M

meowi1231221212

Gast
Mein Fehler, die Schleife sollte natürlich so aussehen:

Code:
for(int x=-500;x<1;x++) {
 if((x *x * 4987142) < 0) {
     System.out.println(x):
 }
}

Und wie oben geschrieben, es soll extra KEIN LONG genutzt werden.

Hierbei ist z.B. für
-29 * -29 * 4987142 das Ergebnis negativ
-30 * -30 * 4987142 das Ergebnis positiv

Deshalb verstehe ich den Überlauf nicht ganz. Es sollte dann doch auch bei -30 * -30 dieser stattfinden?


Wenn x = -29 ist kommt folgendes (in Java raus): -100780874

Dies entspricht auch folgendes
((-29 * -29 * 4987142 ) mod 2147483648 ) - 2147483648

Hierbei ist das Modulo 2147483648 die max Größe. Jedoch muss ein weiteres mal dieser abgezogen werden!? Dieses erneute abziehen muss jedoch nicht bei jeder Möglichkeit von X gemacht werden.!?
 

Monaria

Aktives Mitglied
negative Zahl * negative Zahl = positive Zahl.
Von dem her könntest du genauso gut schreiben
Code:
for(int x=500;x> 0;x--) {
Und das entspricht wieder der ersten Schleife, bloß eben umgekehrt.

Der Überlauf findet (von 0 --> 500) schon bei 21 statt. Der "Überfluss" wird zum Minimum hinzuaddiert, der Rest ist verloren.
Das geht dann immer so weiter und irgendwann ist der Überfluss eben so groß, dass die Summe dessen und des Minimums positiv ist.
Überschreitet die Summe das Maximum, dann geht′s von Vorne los.
Deswegen ergeben nicht alle Werte für x negative Ergebnisse.

Hoffe ist einigermaßen verständlich :)
 
M

meowi1231221212

Gast
Okai,
eine Idee wie solch eine Implementierung vernünftig erfolgen könnte (ohne long zu benutzen)
 

Monaria

Aktives Mitglied
Tja, du hast einen Eimer willst aber mehr rein füllen als in den Eimer hineinpasst.
Das einfachste wäre einen größeren Eimer zu nehmen (man könnte sich auch provisorisch einen Eimer zusammenbasteln), und da du long nicht willst könntest du BigInteger nehmen.
Aber was spricht denn bei deinem Ziel gegen die Verwendung von long?
 
M

meowi1231221212

Gast
Das Problem ist, dass dieses Problem (wie oben beschrieben) in einer Java Applikation steht (diese kann ich nicht umschreiben). Mein Ziel ist es dieses Programm in einer anderen Programmiersprache (nicht Java) umzuschreiben.
Jedoch soll das Resultat das Gleiche sein.
Daher müsste ich "künstlich" diesen Overflow generieren
 

Monaria

Aktives Mitglied
Du könntest dir selbst eine Klasse zur Verwaltung einer Zahl schreiben. Intern hast du als Minimum und Maximum die entsprechenden Werte für Integer.
Der Zugriff erfolgt dann nur über public Methoden wie add(). In den Methoden könntest du das mit dem Überlauf dann einbauen.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Automatische Updates Logik Allgemeine Java-Themen 7
G Automatische Regelmässige Updates Allgemeine Java-Themen 3
M Automatische Steuerung der Maus Allgemeine Java-Themen 6
M Algorithmus für automatische Zeilenumbrüche Allgemeine Java-Themen 12
C automatische email nach 6 tagen! Allgemeine Java-Themen 14
R Automatische Code Dokumentation Allgemeine Java-Themen 3
T Automatische Emails versenden mit Java? Allgemeine Java-Themen 5
P automatische geometrieermittlung auf grund von farbwerten Allgemeine Java-Themen 5
R Datentypen Korrekte integer in Hex ASCII Konvertierung und serialisierung Allgemeine Java-Themen 1
E Webservice zur Konvertierung IBAN/BIC -> Bank Name Allgemeine Java-Themen 1
E SimpleDateFormat-Konvertierung funktioniert nicht Allgemeine Java-Themen 3
C 2D-Grafik Konvertierung RGB-Farbwert und zurück scheitert Allgemeine Java-Themen 3
A NullPointer bei konvertierung von byteArr --> Object Allgemeine Java-Themen 3
F Konvertierung von MPG (oder anderen Typ) nach Flash Allgemeine Java-Themen 4
G Konvertierung des Zeichensatzes. Allgemeine Java-Themen 3
O Konvertierung Signed-Unsigned und HEX, DEC, BIN Allgemeine Java-Themen 2
X Ungeprüfte Konvertierung Allgemeine Java-Themen 2
G String Konvertierung Allgemeine Java-Themen 6
R konvertierung von bbcode <-> html Allgemeine Java-Themen 5
S Konvertierung RSS nach WML Allgemeine Java-Themen 2

Ähnliche Java Themen

Neue Themen


Oben