title image


Smiley Re: Rechnerinterne Zahlendarstellung
... ein klein wenig anders ist es doch, denn -1 entspricht FFFF (nicht FFFE), wovon man sich durch "Debug.Print Hex(-1)" oder kurz "?Hex(-1)" im Direktfenster überzeugen kann.Schreibt man hingegen "?Hex(-1&)", so erhält man FFFFFFFF (ebenfalls nicht FFFFFFFE).Und jetzt schütte ich Euch ein wenig mit Theorie zu:Das liegt an der sog. "Zweierkomplement-Darstellung", die im Allgemeinen auf Compies verwendet wird:Eine Integer-Variable beispielsweise belegt 2 Bytes, also 16 Bits.Die Zahl 1 wird Hexadezimal als 1 und binär als 0000 0000 0000 0001 dargestellt unddie Zahl -1 Hexadezimal als FFFF und binar als 1111 1111 1111 1111. Die negative Zahl erhält man im Zweierkomplement aus der positiven, indem man:die positive Zahl bitweise invertiert unddann noch 1 addiert. Beispiel für die Zahl 1 :    Dez   Bin   Hex   Ausgangswert  1  0000 0000 0000 0001  1   bitweise invertiert  -2  1111 1111 1111 1110  FFFE   1 addiert  -1  1111 1111 1111 1111  FFFF  Warum die 1 addiert wird?Nun, wir wissen, daß die Addition von 1 und -1 zusammen 0 ergibt:    1 + (-1) = 0. Binär geht das so:         0000 0000 0000 0001     +   1111 1111 1111 1111    -------------------------     = 1 0000 0000 0000 0000    ========================= Die erste 1 ist der Übertrag, den wir hier vergessen können. Durch die Darstellung als Zweierkomplement kann der Computer (=die CPU) also Subtraktionen auf eine bitweise Invertierung und zwei Additionen zurückführen. Ein "Subtrahierwerk" ist also nicht erforderlich. Bei der hier besprochenen Zahl -75 geht das also so:    Dez   Bin   Hex   Ausgangswert  75  0000 0000 0100 1011  4B   bitweise invertiert  -76  1111 1111 1011 0100  FFB4   1 addiert  -75  1111 1111 1011 0101  FFB5  Hex(-75) ist also gleich FFB5. Die Addition von &h4B und &hFFB5 ergibt wieder Null mit Übertrag. Jetzt noch der Unterschied zwischen FFFF und FFFFFFFF: Visual Basic kennt bekanntlich drei verschiedene ganzzahlige Variablentypen: Byte, Integer und Long (Komm' mir jetzt bloss keiner mit Currency und Variant/Decimal, grins!) Eine Byte-Variable belegt 8 Bits und kann Zahlen zwischen 0 und 255, bzw. Hex 0 und Hex FF darstellen. Negative Zahlen können mit einer Byte-Variablen nicht dargestellt werden.  Integer-Variable (etwas ausführlicher):  Hex   Bin   Dez  8000  1000 0000 0000 0000  -32768  8001  1000 0000 0000 0001  -32767  8002  1000 0000 0000 0002  -32766  ...  FFFE  1111 1111 1111 1110  -2  FFFF  1111 1111 1111 1111  -1  0  0000 0000 0000 0000  0  1  0000 0000 0000 0001  0  ...  7FFF  0111 1111 1111 1111  32767  also Zahlen zwischen minus 32768 und plus 32767. Long-Variable (in Kürze):  Hex   Dez  80000000  -2147483648  ...  FFFFFFFF  -1  0  0  ...  7FFFFFFF  2147483647  also Zahlen zwischen minus 2147483648 und plus 2147483647. die binäre Darstellung spare ich mir hier.  Wenn man also schreibt "?Hex(-75)", so versucht VB, die Zahl in den kleinst möglichen Variablentyp zu konvertiern, der diese Zahl darstellen kann. Bei -75 wird ein Integer - Variablentyp benötigt, woraus dann (siehe oben) am Ende FFB5 herauskommt.Bei "?Hex(-75&)" habe ich durch das "&" - Zeichen VB gezwungen, -75 als Long - Variable zu interpretieren, also habe ich FFFFFFB5 erhalten. Und nun, liebe Kinder, die Hausaufgabe:Was ergibt:?Hex(CLng(&hFFFF))?CLng("&hFFFF")?&hFFFF?&hFFFF&Und warum?&hFFFF ist ein Integer mit Wert -1. Der wird nach Long konvetiert, ergibt Long mit -1, und dann nach Hex, ergibt den String "FFFFFFFF".Wir zwingen VB, den String "&hFFFF" als Long zu interpretieren, also als &h0000FFFF. Ergebis: 65535.&hFFFF ist ein Integer mit Wert -1.&hFFFF& ist ein Long mit Wert &h0000FFFF, also 65535.
Thomas Prötzsch

geschrieben von

Login

E-Mail:
  

Passwort:
  

Beitrag anfügen

Symbol:
 
 
 
 
 
 
 
 
 
 
 
 
 

Überschrift: