Variable mit 8 Byte

  • Excel

Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von Eierlein.

    Variable mit 8 Byte

    Hallo zusammen!

    Ich habe folgendes Problem und hoffe hier eine Antwort zu bekommen.

    Also bei dem folgenden Code wird mit zwei Variablen die Hex Werte beinhalten eine "Xor" Verknüpfung erzeugt.
    jedoch sind die Rechen Ergebnisse nicht richtig da die Variablen nur 4 Byte enthalten, obwohl sie als Double deklariert sind.
    Wie kann ich es schaffen, dass die Variablen 8 Byte groß sind damit die Rechnung richtig ist.

    Hier ist der Code:

    Visual Basic-Quellcode

    1. Sub HexRechnen()
    2. Dim HexWert As Double
    3. Dim Zahl(1 To 3) As Double
    4. HexWert = &H98765432
    5. Zahl(1) = &HFFFFFFFF
    6. Zahl(2) = &H87654321
    7. Zahl(3) = &H76543210
    8. For i = 1 To 3
    9. HexWert = HexWert Xor Zahl(i)
    10. Debug.Print HexWert
    11. Next i
    12. End Sub


    mfg
    Kirli

    *Topic verschoben, BBCode eingefügt*

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()

    Hallo ThuCommix!

    erstmal danke für deine Antwort.
    Es handelt sich um VB um genauer zu sein um VBA.
    Versucht hab ich es auch schon mit long, Ergebnis ist gleich.
    wenn ich jedoch Hex in Dezimal umrechne und laufen lasse da gibt es aber schon bei der Berechnung
    die Fehlermeldung Überlauf


    mfg
    kirli
    Bitte beachten:
    Umrechnung: Zahlensysteme
    Es gibt keine Hex-Werte. Hex(adezimal) ist eine Repräsentation. Ein Integer mit dem Wert dreizehn kann sowohl als "13" (dezimal) als auch als "D" (hexadezimal) repräsentiert werden. Der Wert ist der gleiche.

    Da Du von XOR-Verknüpfungen sprichst vermute ich mal, dass Du mit ganzen Zahlen arbeiten willst. Ein Double ist eine Gleitkommazahl. Das ist nicht das, was Du brauchst.

    Ich kenne mich mit VBA zu wenig aus (das Label ist übrigens VB6) aber es sollte doch möglich sein, eine Liste von Datentypen zu finden, die es in VBA gibt und dann einfach den passenden auszuwählen.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    Hallo Kirli,
    eine Variable vom Typ Double hat in VBA 8 Bytes.
    Deine Zahlenwerte haben 8 Zeichen, benötigen aber
    nur 4 Bytes, weil immer zwei aufeinanderfolgende
    Zeichen in ein Byte kommen. Für ganzzahlige Hex-
    Zahlen sollte man auch immer Ganzzahlvariablen
    verwenden. Probier's mal mit Long.
    Die Funktion XOR (und auch AND und OR) funktionieren
    nur im Long-Bereich, selbst wenn die Variable
    größere Zahlen aufnehmen kann. Wenn du wirklich
    Hex-Zahlen hast, die den Long-Bereich überschreiten,
    must du sie zerlegen und nach dem Rechnen wieder
    zusammensetzen.
    Gruss,

    Neptun
    Unabhängig von allem, mich verwirrt VB.Net ein wenig.
    Nehme ich folgende Zeile Dim a As Long = &H98765432* wird der Wert als -1737075662 dargestellt, in C# jedoch 2557891634 (Int64 a = 0x98765432;).

    *Long = 64-Bit-Ganzahl mit Vorzeichen

    slice schrieb:

    Unabhängig von allem, mich verwirrt VB.Net ein wenig.
    Nehme ich folgende Zeile Dim a As Long = &H98765432* wird der Wert als -1737075662 dargestellt, in C# jedoch 2557891634 (Int64 a = 0x98765432;).


    Genau das ist mein Problem. Wenn ich die gleichen Werte mit dem Taschenrechner rechne kommen ganz andere Werte raus.
    @slice und ich haben uns gerade per Konversation darüber unterhalten.
    Bei .NET gilt zumindest folgendes:
    Das Literal z.B. &H98765432 hat einen negativen Wert und es hat den Typ Int32! Dim a As Int64 = &H98765432 ist also das selbe wie folgendes:

    VB.NET-Quellcode

    1. Const Temp As Int32 = &H98765432 '-1737075662
    2. Dim a As Int64 = Temp
    Jetzt sollte offensichtlich sein, warum da ein negativer Wert herauskommt.
    Man kann dem Literal aber ein "L" anhängen: Dim a As Int64 = &H98765432L. Das steht für "Long". Das bedeutet dann das selbe wie folgendes:

    VB.NET-Quellcode

    1. Const Temp As Int64 = &H98765432L '2557891634
    2. Dim a As Int64 = Temp


    Das wird in VBA wohl ähnlich sein.

    Wenn Du uns erklärst, woher Deine Zahlen kommen, was Du berechnen willst und was Du mit dem Ergebnis machen willst, dann können wir besser verstehen, was Du vor hast. Und dann können wir auch besser Tipps geben.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    Nehme ich folgende Zeile Dim a As Long = &H98765432* wird der Wert als -1737075662 dargestellt


    So klappt's auch bei VB.Net:

    VB.NET-Quellcode

    1. Dim a As Long = &H98765432&
    2. oder
    3. Dim a As Long = &H98765432L
    4. Es reicht auch Uinteger


    Spielt aber keine Rolle, ein VBA LONG (Int32) entspricht einem VB.Net Integer.
    Und damit klappt's nicht.
    In 64-Bit-Umgebungen gibt es für VBA den Typ LongLong mit 64 Bit.
    Ich hab's nicht probiert, aber der müsste auch mit booleschen Operatoren funktionieren.

    Wenn allerdings der Code auch auf 32-Bit-Office laufen soll, musst du dich mit Long begnügen und bist auf 4 Byte begrenzt.
    Nofalls musst du deine Werte splitten.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Also die Zahlen stammen aus einem Assemblercode womit Adressen berechnet werden.
    jedoch ist das Ganze in einer Schleife unter gebracht die mehrere Berechnungen erfordert.
    es kommt jedoch nach dem zweiten Durchlauf zu falsch Berechnung, womit das Ergebnis
    nicht mehr stimmt. Nun wollte ich wissen was da falsch läuft und gleiche Struktur in VB
    aufgebaut und festgestellt, dass durch die unvollständige Darstellung der Zahlen in den Variablen
    ein falsches Ergebnis zustande kommt.
    jetzt suche ich nach eine Möglichkeit die vollen Werte der Zahlen in den Variablen darzustellen.
    Damit die Berechnungen stimmen.
    Aber da ich nur VBA zu Verfügung habe um überhaupt etwas probieren zu können,
    habe ich mein Excel Visual Basic Editor zur Hilfe genommen.
    Da habe ich aber auch das Problem, dass ich keinen passenden Datentyp finde.
    So sollte es mit VBA funktionieren:


    Visual Basic-Quellcode

    1. Sub HexRechnen()
    2. Dim HexWert As Long
    3. Dim Zahl(1 To 3) As Long
    4. Dim i As Long, z As Long
    5. Dim Ergebnis As Currency
    6. HexWert = &H98765432
    7. Zahl(1) = &HFFFFFFFF
    8. Zahl(2) = &H87654321
    9. Zahl(3) = &H76543210
    10. For i = 1 To 3
    11. z = HexWert Xor Zahl(i)
    12. Ergebnis = t(z)
    13. Debug.Print Ergebnis
    14. Next
    15. End Sub
    16. Function t(ByVal z As Long) As Currency
    17. If z < 0 Then
    18. z = z And 2147483647#
    19. t = z + 2147483648#
    20. Else
    21. t = z
    22. End If
    23. End Function