Allgemeine Frage zu Hex und Dec

  • Hi,

    hier im Forum hat vor ca einer Stunde jemand eine Frage gestellt, erst dachte ich, das ganze sei total einfach. Allerdings habe ich jetzt gerade beim rumprobieren festgestellt, dass ich meine kleine begrenzte Welt nicht mehr verstehe :(
    In der Theorie und auf dem Blatt Papier kann ich mit beiden Zahlensystemen bis ins Unendliche rechnen (sofern die Tinte und das Papier ausreichen ;) ). Bei AutoIT habe ich allerdings etwas, für mich, sehr seltsames endeckt.
    Folgendes ergibt 0

    [autoit]

    $y = 0xFFFFFFFF
    MsgBox(0,"result",$y)

    [/autoit]


    Folgendes ergibt -2147483648

    [autoit]

    $y = 0x80000000
    MsgBox(0,"result",$y)

    [/autoit]


    Folgendes ergibt 2147483647

    [autoit]

    $y = 0x7FFFFFFF
    MsgBox(0,"result",$y)

    [/autoit]


    Folgendes ergibt 0

    [autoit]

    $y = 0x00000000
    MsgBox(0,"result",$y)

    [/autoit]


    Wobei hingegen im Dezimalen Bereich das Rechenlimit bei 10^308 liegt

    [autoit]

    $x = "10"
    $y = "308"
    MsgBox(0,"result",$x^$y)

    [/autoit]


    Wenn man nun allerdings versucht dieses 10^308 in das Hexadezimalsystem umzuwandeln bekommt man ein föllig falsches Ergebnis, das da lautet 0x80000000

    [autoit]

    $x = "10"
    $y = "308"
    $z=$x^$y
    MsgBox(0,"result",Hex($z))

    [/autoit]


    Das wiederum bedeutet, dass in AutoIT -2147483648 = 10^308 ist???
    (nochmal aufgebröselt:10^308 ->(in Hex)->0x80000000->(in Dezimal)->-2147483648 )
    Ausserdem wäre in AutoIT 0xFFFFFFFF und 0x00000000 gleich zu setzen, was wiederum, falls in Dec umgewandelt, anschließend damit gerechnet und wieder in Hex umgewanelt föllig sinnfreie Ergebnise produziert werden....
    siehe:

    [autoit]

    $x = 0xFFFFFFFF
    $y = Dec($x)
    $z = Hex($y)
    MsgBox(0,"result","0x"&$z)

    [/autoit]


    in der Box wird 0x00000000 ausgegeben?
    Wo liegt da der Sinn?
    Ich verstehe meine mathematische Welt wirklich nicht mehr.... Kann mir hier jemand auf die Sprünge helfen?

    Der korrekte "Zahlenstrahl", Dec in Hex umgewandelt, müsste folgendermaßen aussehen:
    0...1....2147483647...2147483648...4294967294...4294967295 ->in Hexadezimal
    -> 0...1...7FFFFFFF...80000000...FFFFFFFE...FFFFFFFF
    In AutoIT sieht der "Zahlenstrahl", Dec in Hex umgewandelt, allerdings so aus:
    0...1....2147483647...-2147483648...-1...0 ->in Hexadezimal
    -> 0...1...7FFFFFFF...80000000...FFFFFFFE...FFFFFFFF
    (diese "Zahlenstrahle" kann man selbstverständlich in der Theorie bis ins unendliche weiterführen, ich habe hier allerdings die Diskrepanz zwischen meiner Logik und AutoIT aufzeigen wollen)

    Ich bitte darum, dass mir hier jemand auf die Sprünge hilft...

    Viele Grüße

  • Du kannst mit Hex-Werten rechnen, die in ein 32Bit signed Integer passen, also von -2^31 bis 2^31-1
    weiters verlangt Dec einen Hex-String ohne Prefix
    Dec(0xFFFFFFFF) wäre dasselbe wie Dec(-1) und das ergibt 0, weil Error

    [autoit]

    ConsoleWrite("-=========================================" & @CRLF)
    _Hex(0)
    _Hex(-1)
    _Hex(1)
    _Hex(-2 ^ 31)
    _Hex(2 ^ 31 - 1)
    _Hex(-2147483648 - 1)
    _Hex(2147483647 + 1)
    ConsoleWrite("-=========================================" & @CRLF)
    _Dec("00000000")
    _Dec("FFFFFFFF")
    _Dec("00000001")
    _Dec("80000000")
    _Dec("7FFFFFFF")
    _Dec("FFFFFFFFF")
    _Dec(0xFFFFFFFF)
    ConsoleWrite("-=========================================" & @CRLF)

    [/autoit][autoit][/autoit][autoit]

    Func _Hex($Val)
    Local $Hex = Hex($Val)
    Local $Dec = Dec($Hex)
    If $Dec = $Val Then
    ConsoleWrite("+ " & $Val & @TAB & " => " & $Hex & @TAB & " => " & $Dec & @CRLF)
    Else
    ConsoleWrite("! " & $Val & @TAB & " => " & $Hex & @TAB & " => " & $Dec & @CRLF)
    EndIf
    EndFunc ;==>_Hex

    [/autoit][autoit][/autoit][autoit]

    Func _Dec($Val)
    Local $Dec = Dec($Val)
    Local $Hex = Hex($Dec)
    If $Hex = $Val Then
    ConsoleWrite("+ " & $Val & @TAB & " => " & $Dec & @TAB & " => " & $Hex & @CRLF)
    Else
    ConsoleWrite("! " & $Val & @TAB & " => " & $Dec & @TAB & " => " & $Hex & @CRLF)
    EndIf
    EndFunc ;==>_Dec

    [/autoit]