kleinere datentyp in größeren Speichern

  • VB.NET

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von SpaceyX.

    kleinere datentyp in größeren Speichern

    Sehen wir uns das folgende beispiel an. c3 ist immer 0. Ich denke weil c2 durch das viermallige shiftern die 4 1en wegshiftet. und nur 0en bleiben. Aber ich dachte wenn mein c3 groß genug ist, dann muss ja auch c2 geshiftet in c3 hineinpassen? Wie muss man das sonst machen?

    Quellcode

    1. Dim c2 As Byte = &HF0
    2. Dim c3 As Double = 0
    3. c3 = c2 << 4
    Gleitkommazahlen funktionieren ein bisschen anders als Ganzzahlen. Lass das mal mit dem Double.

    Ganz richtig, wenn Du das Byte &HF0 um 4 stellen nach links shiftest, dann bleibt 0000 0000 übrig, da ein Byte nun mal nur 8 Bit groß ist und alles, was drüber hinausläuft einfach abgeschnitten wird.

    c2 muss einen anderen Typ haben....

    VB.NET-Quellcode

    1. Dim c2 As Integer = &HF0
    2. Dim c3 As Long = 0L
    3. c3 = c2 << 4


    Integer zum Beispiel (32-bit). Wenn Du nun &HF0 um 4 nach links shiftest bekommst Du => &HF00. Auch das würde noch locker in einen Integer als Ziel passen (c3). Shiftest Du einen Integer so weit nach links, dass die Stelle 0^31 den Wert 1 annimmt, werden die Zahlen negativ. Wenn das ein Problem ist, dann lieber die Unsigned-Varianten nehmen.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    Dir muss bewusst sein, dass es auch Zwischenergebnisse gibt - und die sind in dem Fall das "Problem".
    Bilder
    • Zwischenergebnis.png

      5,05 kB, 601×134, 54 mal angesehen
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Dann verstehe ich den Grund nicht, warum Du überhaupt den Wert, den Du von einer Schnittstelle bekommst, shiftest...
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    Weil der Messwert aus mehreren Bytes besteht, also aus c2(0) und c2(1). Der wert in c2(0) ist der MSB und benutzt alle 8 Bit aber in c2(1) (LSB) werden die letzten (höherwertigen) 5 Bits benutzt. Und ich muss daraus eine Zahl Zusammenfügen. Also

    VB.NET-Quellcode

    1. ​neueZahl = (c2(0) << 8) Or (c2(1) >> 3)


    Und da gibts dann das Problem mit dem shiften. Wie könnte ich diese lösen? beim zwischenspeichern übernimmt er anschienend immer den kleineren Datentyp also wenn ich mit
    Dim temp As int
    temp= c2(0) <<8

    mache habe ich ja dieses problem wiederP
    Sollte so gehen, wenn ich nach Deiner Beschreibung gehe....

    VB.NET-Quellcode

    1. Dim number As UInt32 = 0
    2. Dim c20 As Byte = &HF0
    3. Dim c21 As Byte = &HAA
    4. number = number Or c20
    5. number = (number << 8) Or (c21 >> 3)


    Ergebnis ist = &HF015.... Alle 8 Bits aus dem ersten Byte und 5 aus dem letzten Byte, nachdem 2^0, 2^1 und 2^2 abgeschnitten wurden.....
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o