Datentyp Aufgabe

02/12/2013 19:06 sujeepan13#1
haaaay :D

naja ich hab da mal so ein problem bin gerade im ersten jahr als programmierer :D haben gerade java

schaut euch das mal an:
short a = 32000, b = 32000;
int c = 3 * a * b;
tools.showMessage("c=" + c);

sollte ja irgendwie 3'072'000'000 geben (wäre ja zu gross für int müsste also fehlermeldung geben) aber irgendwie kommt c= -1'222'967'296 raus :o

hoffe jemand kann mir helfen..
(weiss nicht ob ich hier richtig bin sonst bitte ins richtige topic damit :o)
02/12/2013 19:22 BigJk#2
Ich weiß nicht wie das mit den Fehlern bei Java ist und warum dann c auf diesen Wert gesetzt wird, aber wenn du sehen willst ob es wirklich zu groß ist kannst du ja vorher einen eigenen Check einbauen.

Sowas dann einfach in Java übernehmen:
Code:
wenn ( 3 * a * b ) > Integer.MAX_VALUE dann
    //FEHLER, ZAHL ZU GROß
Code:
wenn ( 3 * a * b ) < Integer.MIN_VALUE dann
    //FEHLER, ZAHL ZU KLEIN
Integer.MIN_VALUE / Integer.MAX_VALUE ist schon in Java implementiert und habe ich hier gefunden:

[Only registered and activated users can see links. Click Here To Register...]

(btw. das hier ist die .NET Section, also C# und VB ;) also nicht ganz passend wenns um Java geht)
02/12/2013 22:02 MoepMeep#3
Der Wert ist zu groß und wird abgeschnitten, ist doch klar warum dann -1222967296 rauskommt.
02/12/2013 23:34 BigJk#4
Wäre eigentlich logisch aber müsste dann der Überschuss nicht -924516353 sein?

Das Integer Maximum ist 2147483647. (Laut Integer.MAX_VALUE)
Unsere Zahl die bei 3 * 32000 * 32000 rauskommt ist 3072000000

2147483647 - 3072000000 = -924516353

Dann müsste der Überschuss doch -924516353 und nicht -1222967296 sein, oder sehe ich das Falsch?
02/13/2013 07:58 MoepMeep#5
Quote:
Originally Posted by BigJk View Post
Wäre eigentlich logisch aber müsste dann der Überschuss nicht -924516353 sein?

Das Integer Maximum ist 2147483647. (Laut Integer.MAX_VALUE)
Unsere Zahl die bei 3 * 32000 * 32000 rauskommt ist 3072000000

2147483647 - 3072000000 = -924516353

Dann müsste der Überschuss doch -924516353 und nicht -1222967296 sein, oder sehe ich das Falsch?
Siehst du falsch. Wie kommst du auf diese sinnlose rechnung?
02/13/2013 08:55 snow#6
Die Zahl wird mit dem Überlauf zu tun haben.
@TE: Kannst dir ja mal die Bits aufmalen und anschauen, was bei einer Veränderung, die über Integer.MAX_VALUE liegt, passiert.
02/13/2013 10:59 xNopex#7
(2147483647)10 = (...0000 0111 1111 1111 1111 1111 1111 1111 1111)2
(3072000000)10 = (...0000 1011 0111 0001 1011 0000 0000 0000 0000)2

letzteres auf 32bit (int) abgeschnitten:
(1011 0111 0001 1011 0000 0000 0000 0000)2
Führende Eins -> negativ -> 2-Komplement bilden:
a) Bits invertieren:
(0100 1000 1110 0100 1111 1111 1111 1111)2
b) 1 addieren:
(0100 1000 1110 0101 0000 0000 0000 0000)2
->
(1222967296)10

--> (1011 0111 0001 1011 0000 0000 0000 0000)2 = (-1222967296)10
02/13/2013 16:52 BigJk#8
Quote:
Originally Posted by MoepMeep View Post
Siehst du falsch. Wie kommst du auf diese sinnlose rechnung?
Ich hab einfach stur den Überschuss ausgerechnet ^^ war aber scheinbar doch nicht richtig. Siehe xNopex post.
02/18/2013 17:58 »Barney«#9
use an Int64 (long, ulong)