Umechnung von Zahlensystemen



  • Original erstellt von virtual:
    Und was machst Du auf Systemen, wo ein "char" einem "unsigned char" entspricht? - Warnungen disablen?

    den compiler umstellen, damit er wieder normal funktioniert.

    nee, aber ich schreib keinen plattformunabhängigen code. viele sachen plane ich gleich mit ein. so sind u64 und u8 eigene typedefs, die ich beim wechsel auf ne andere maschine leicht ändern kann. aber alle möglichen verrüktheiten plane ich nicht ein. insbesondere ist bei mir ein char signed. und das wird er bei mir auch sein, wenn ich linux oder bsd verwende.

    übrigens steht nirgends im standard, daß ein compiler da warnen muß. wo ist also das problem?



  • Naja, da du sagst, daß Du eh nicht platformunabh. sein willst, ist mein Einwand eh hinfällig. 😉 Das eigentliche Problem ist:

    while((d=hextable[u8(*str)])>=0)
    

    Wenn char auf der Platform unsigned wäre (ist es auf Deinen wohl nicht), dann ist die Bedingung stets wahr und die Routine macht eben was anderes als auf einer Platform, wo char signed ist. Der Compiler wird ggf. nur eine unauffällige Warnung machen, die Folge sind aber unterschiedliche Ergebnisse je nach Platform.
    Aber da ich ja jetzt weiss, daß Dein char signed ist, kann ich Routine sogar verstehen 😃



  • Original erstellt von virtual:
    Der Compiler wird ggf. nur eine unauffällige Warnung machen, die Folge sind aber unterschiedliche Ergebnisse je nach Platform.

    Ich find die "the condition is always true" nicht gerade unauffällig. Aber hast schon recht, wenn der Compiler verstellt ist auf signed chars, dann kommt da ne kleine Schutzverletzung geflogen.



  • Original erstellt von FrankMeyer:
    **Hi Mady,

    dein Hex2Int funktioniert bei mir nicht. ...**

    Hmmm ... kannst Du mir das vielleicht genauer beschreiben??



  • Original erstellt von volkard:
    **na, wenn man C++ benutzen darf, hier mein reader, den ich zur zeit verwende:

    u64 readhex(char*& str)
    {
        static char hextable[256]={
            -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
            -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
            -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
            0,1,2,3,4,5,6,7,8,9,-1,-1,-1,-1,-1,-1,
            -1,10,11,12,13,14,15,-1,-1,-1,-1,-1,-1,-1,-1,-1,
            -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
            -1,10,11,12,13,14,15,-1,-1,-1,-1,-1,-1,-1,-1,-1,
            -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
            -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
            -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
            -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
            -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
            -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
            -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
            -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
            -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
        };
        u64 result=0;
        char d;
        while((d=hextable[u8(*str)])>=0)
        {
            result=result<<4^d;
            ++str;
        }
        return result;
    }
    

    **

    Ehm, das geht aber auch sehr viel kürzer...



  • aber nicht so effizient. ist doch scheiss egal wie lang das ist



  • Hab halt gern kurzen Code.
    BTW: Was heißt effizient schon im Zeitalter von Gigahertz??? Da kommts auf eine Bedingung mehr oder weniger nicht mehr an...
    EDIT: Auf jeden Fall nicht immer 😃

    Ist aber jedem selber überlassen

    [ Dieser Beitrag wurde am 24.01.2003 um 18:38 Uhr von MaSTaH editiert. ]



  • die lösung mit solch einer table ist einfach cool 🕶



  • Original erstellt von <volkart>:
    die lösung mit solch einer table ist einfach cool 🕶

    ach, darum gehts nicht.
    ebensocool ist ne kleine elegante lösung. ner große tabelle ist nicht elegent.
    ich verwendete die tabelle aus vielerlei gründen, die euch zwar nicht interessieren, aber da ich heut an nem rechner bin, sag ich sie mal:
    a) das prog mach fast nix. ob es 4k frißt oder 5k ist echt egal, hier kostet die tabelle mal nix.
    b) ich spiele zur zeit bei den acme softies oft mit. das schärft das gefühlt für jeden einzelnen verschwendeten takt.
    c) der gezeigte code war nur zur anschauung, um auch diese lösung mal zu zeigen, wer so ne funktion dann mal braucht, wähle zwischen allen vorschlägen die für ihn geeignete aus.
    d) auf intel mag die tabelle besser sein oder nicht (vermutlich oft besser, weil solche umwandlungen im großen rudel kommen). aber auf mmix mag ne tabelle eher immer schlecht sein.



  • umrechnungsbeispiele von dez->hex stehen im C++ forum unter hexadezimal.


Anmelden zum Antworten