Unterscheidung bei int zwischen 0 und null



  • vista schrieb:

    Andrey schrieb:

    @OP: nimm ruhig unsigned int und definiere für sich einfach 0xFFFF als den ungültigen wert. das ist 2^32=4.294.967.296 wann wirst du schon so eine riesenzahl gebrauchen können? und dann verlierst du nur eine einzige kombination...

    besser -1 oder (unsigned)-1, das sollte immer alle bits auf 1 setzen, egal wie breit die integers sind.

    Nö. Stichwort: Sign-and-magnitude 🤡



  • @hustbaer: Soll das so eine Art Vorteil sein? Also bis auf Artchis Ersatz bei überladenen Methoden habe ich bisher noch keinen Sinn gesehen. Da solcher Art Funktionen wohl nicht gerade dauernd vorkommen sehe ich eher schwarz, dass sich das durchsetzen wird.

    MfG SideWinder



  • TactX schrieb:

    vista schrieb:

    Andrey schrieb:

    @OP: nimm ruhig unsigned int und definiere für sich einfach 0xFFFF als den ungültigen wert. das ist 2^32=4.294.967.296 wann wirst du schon so eine riesenzahl gebrauchen können? und dann verlierst du nur eine einzige kombination...

    besser -1 oder (unsigned)-1, das sollte immer alle bits auf 1 setzen, egal wie breit die integers sind.

    Nö. Stichwort: Sign-and-magnitude 🤡

    wieso nicht? erklär bitte...



  • Er hat ja schon ein Stichwort geliefert, schlag das doch nach!

    http://en.wikipedia.org/wiki/Sign_and_magnitude

    MfG SideWinder



  • SideWinder schrieb:

    Er hat ja schon ein Stichwort geliefert, schlag das doch nach!

    geht es um ausnahmen (falls negative zahlen nicht als 2er-komplement gespeichert werden)?
    oder wie soll ich das verstehen?



  • vista schrieb:

    SideWinder schrieb:

    Er hat ja schon ein Stichwort geliefert, schlag das doch nach!

    geht es um ausnahmen (falls negative zahlen nicht als 2er-komplement gespeichert werden)?
    oder wie soll ich das verstehen?

    Ja, das meinte ich.



  • SideWinder schrieb:

    @hustbaer: Soll das so eine Art Vorteil sein? Also bis auf Artchis Ersatz bei überladenen Methoden habe ich bisher noch keinen Sinn gesehen. Da solcher Art Funktionen wohl nicht gerade dauernd vorkommen sehe ich eher schwarz, dass sich das durchsetzen wird.

    MfG SideWinder

    Klar ist das ein Vorteil. Ein Fehler mehr den der Compiler melden kann ist ein Vorteil !?!
    Ich bin gerade kein besonderer Fan der nullptr Sache, ist mir im Prinzip herzlich egal, wollte nur darauf hinweisen dass es sehrwohl einen Unterschied macht.



  • TactX schrieb:

    vista schrieb:

    SideWinder schrieb:

    Er hat ja schon ein Stichwort geliefert, schlag das doch nach!

    geht es um ausnahmen (falls negative zahlen nicht als 2er-komplement gespeichert werden)?
    oder wie soll ich das verstehen?

    Ja, das meinte ich.

    aber es gibt doch wohl keine CPU mehr, die das so macht.
    wer braucht schon eine negative 0?
    😉



  • @hustbaer: Welchen genauen Fehler erkennt man den damit? Die unabsichtliche Initialisierung eines Integers mit 0 anstatt mit 0?

    MfG SideWinder



  • vista schrieb:

    TactX schrieb:

    vista schrieb:

    SideWinder schrieb:

    Er hat ja schon ein Stichwort geliefert, schlag das doch nach!

    geht es um ausnahmen (falls negative zahlen nicht als 2er-komplement gespeichert werden)?
    oder wie soll ich das verstehen?

    Ja, das meinte ich.

    aber es gibt doch wohl keine CPU mehr, die das so macht.
    wer braucht schon eine negative 0?
    😉

    Würde mich nicht wundern, wenn es den ein oder anderen DSP gäbe der so arbeitet. Hat ja nicht nur Nachteile.



  • Zum Thema nullptr:

    Die Overload Resolution wird dadurch verbessert!

    Wie kann der Compiler denn unterscheiden, ob er die Überladung mit int oder mit int* nehmen soll, wenn man einfach nur 0 übergibt?

    Beispiel:

    void testklasse::test1(int a)
    {
         m_Test = a;
    }
    
    void testklasse::test1(int* pA)
    {
         *pA = m_Test;
    }
    
    ...
    
    testklasse t;
    t.test1(0);       // Will ich jetzt das Attribut m_Test 0 setzen?
    t.test1(NULL);    // wie eine Zeile höher, der Compiler kann nicht zwischen int und int* unterscheiden und wird die int Variante nehmen
    t.test1(nullptr); // Hier ist klar, dass ich die "Get" Methode (mit Pointer) aufrufen möchte.
    

    Das Beispiel ist vieleicht nicht ganz optimal, aber es ist auf jeden Fall sinnvoll eine Unterscheidung zwischen "normalen" und "pointer" Argumenten zu machen. Ich habe es mir in dem Beispiel erspart die int's auch noch anzulegen.

    Gruß Paddy



  • @Paddy82:
    Für die overload resolution kann man im Moment auch static_cast verwenden.



  • @hustbaer

    Wusste ich noch nicht...

    Ist aber trozdem nicht so "schön" wie wenn man das keyword hat, finde ich.



  • Paddy82 schrieb:

    Zum Thema nullptr:

    Die Overload Resolution wird dadurch verbessert!...

    Was ich gut finde ... aber vermutlich wird das "im echten Leben" zu einigem Ärger führen, weil es vielleicht Programme gibt, die das falsch gemacht haben aber das "richtige Verhalten" damit verbinden....("Leichen im Keller").

    Na, mal abwarten - zur Not gibt's einen Compilerschalter, mit dem man das auf das alte Verhalten umschalten kann.

    Gruß,

    Simon2.



  • Das von euch aber auch keiner auf die Idee gekommen ist mal in der <windef.h> nachzugucken was NULL ist:

    #ifndef NULL
    #ifdef __cplusplus
    const unsigned long NULL = 0;
    #else
    #define NULL ((void*)0)
    #endif
    


  • Wie die Konstante NULL definiert ist, ist compilerspezifisch.
    Beim MinGW steht z.B.

    #ifndef NULL
        #ifdef __cplusplus
            #define NULL 0
        #else
            #define NULL ((void*)0)
        #endif
    #endif
    

    Und da es sich hier ja um c++ handelt gilt #define NULL 0, was bereits mehrfach erwähnt wurde...



  • midon schrieb:

    Das von euch aber auch keiner auf die Idee gekommen ist mal in der <windef.h> nachzugucken was NULL ist...

    Wo finde ich die denn unter Linux ? 😉

    Gruß,

    Simon2.



  • Simon2 schrieb:

    midon schrieb:

    Das von euch aber auch keiner auf die Idee gekommen ist mal in der <windef.h> nachzugucken was NULL ist...

    Wo finde ich die denn unter Linux ? 😉

    Gruß,

    Simon2.

    ach du mit deinem exotensystem da! Kauf dir mal ein gescheites das richtig auf Laptops läuft.



  • liunx-hasser schrieb:

    Simon2 schrieb:

    midon schrieb:

    Das von euch aber auch keiner auf die Idee gekommen ist mal in der <windef.h> nachzugucken was NULL ist...

    Wo finde ich die denn unter Linux ? 😉

    Gruß,

    Simon2.

    ach du mit deinem exotensystem da! Kauf dir mal ein gescheites das richtig auf Laptops läuft.

    Laptops ? Ach Du meinst MacOS ?

    Aber was mach' ich, wenn ich richtig Power brauche und nicht nur so Spielanwendungen ?
    BTW: Isch 'abe garrr kein Linux !

    Gruß,

    Simon2.



  • Simon2 schrieb:

    BTW: Isch 'abe garrr kein Linux !

    Ja also, was laberst Du dann hier über dieses Exoten-OS? Wolltest wohl flamen ne?


Anmelden zum Antworten