Maximal/Minimal Int



  • spjoe schrieb:

    @mfc
    Nur weil du den code nicht verstehst?

    Weil es in C++, im Gegensatz zu C, nicht darum geht, möglichst viel selbst zu schreiben und dadurch sein Wissen zu demonstrieren. Selbst wenn numeric_limits<> wirklich nicht gehen sollte (rauszufinden, warum es das tut, wäre erstmal angebrachter), gäbe es noch <climits>.



  • mfc schrieb:

    spjoe schrieb:

    @mfc
    Nur weil du den code nicht verstehst?

    In C nimmt man INT_MIN und INT_MAX.
    In C++ nimmt man std::numeric_limits.

    Aber niemals so einen Schwachsinn. Deinen Code will ich ich gar nicht verstehen. :p

    glaubst du INT_MIN, INT_MAX und std::numeric_limits sind vom himmel gefallen?!

    Das muss auch jemand programmiern
    BartS wollt wissen wies geht und ich habs in gezeigt wie man das macht wenn man selber code. Datdurch kann man es vieleicht auch besser verstehen.

    PS:
    Schau dir einmal paar header files an
    mgf



  • #define INT_MIN     (-2147483647 - 1) /* minimum (signed) int value */
    #define INT_MAX       2147483647    /* maximum (signed) int value */
    #define UINT_MAX      0xffffffff    /* maximum unsigned int value */
    #define LONG_MIN    (-2147483647L - 1) /* minimum (signed) long value */
    #define LONG_MAX      2147483647L   /* maximum (signed) long value */
    #define ULONG_MAX     0xffffffffUL  /* maximum unsigned long value */
    


  • mfc schrieb:

    #define INT_MIN     (-2147483647 - 1) /* minimum (signed) int value */
    #define INT_MAX       2147483647    /* maximum (signed) int value */
    #define UINT_MAX      0xffffffff    /* maximum unsigned int value */
    #define LONG_MIN    (-2147483647L - 1) /* minimum (signed) long value */
    #define LONG_MAX      2147483647L   /* maximum (signed) long value */
    #define ULONG_MAX     0xffffffffUL  /* maximum unsigned long value */
    

    sicher nicht linux



  • hä?

    Das war ein Ausschnitt der limits.h aus Visual C++ 7.1



  • ja ich meinte nur, weil die defines nur fuer 32bit integer ausgelegt sind



  • mfc schrieb:

    spjoe schrieb:

    #define INTMAX ((int)(~0U>>1))
    #define INTMIN  (-INTMAX -1)
    

    mfg

    sehr schlecht

    "Sehr schlecht" ist keine konstruktive Kretik
    Ich fände es bessser wenn man in diesem forum nur kostruktive Kretik schreibt
    mfg



  • leo aka qsch schrieb:

    ja ich meinte nur, weil die defines nur fuer 32bit integer ausgelegt sind

    windows is halt net platform unabhängig



  • Kretik schreibt man Kretik.



  • Kritik*



  • zum urspruenglichen Problem zurueck:

    beim VC++ ist min ein #define - deshalb gibt es bei numeric_limits fehler.
    einfach mal #undef min davor schreiben, dann muesste es klappen.

    und das diese konstanten nicht portabel sind, ist klar. deshalb verwenden wir ja auch keine magischen zahlen, sondern konstanten, die diese zahlen verstecken und fuer jede plattform angepasst werden.



  • Die hab ich nur gepostet, weil er meinte ich soll in Header gucken.
    Hoffentlich kopiert sich das keiner in seine Projekt rein. 😡 😡
    Machen aber bestimmt einige. 😉



  • #define INTMAX ((int)(~0U>>1))
    #define INTMIN  (-INTMAX -1)
    

    mfg

    1. wenn du das schon nachcodest, kannst es gleich auch richtig machen und const int verwenden ..
    2. würd mich mal interessieren wie du das in nem Template verwendest .. ich würd da einfach numeric_limits<T>::max(), etc.. schreiben

    numeric_limits gibts ja nicht umsonst 😉



  • BartS wollt wissen wies geht ich habs erm gsagt er hätt glaub ich nicht gefragt wenn er mit der numeric_limits zufrieden gewesen werden und es ist ziemlich leicht in einem tmplate zu verwenden.

    template <class _Ty>
    _Ty Max_Value(){
        return ((_Ty)(~0U>>1))
    }
    

    Was heisst nachprogrammieren. Wennnst 3 minuten nachdenkst kommst da auch drauf.



  • spjoe schrieb:

    BartS wollt wissen wies geht ich habs erm gsagt er hätt glaub ich nicht gefragt wenn er mit der numeric_limits zufrieden gewesen werden und es ist ziemlich leicht in einem tmplate zu verwenden.

    template <class _Ty>
    _Ty Max_Value(){
        return ((_Ty)(~0U>>1))
    }
    

    Was heisst nachprogrammieren. Wennnst 3 minuten nachdenkst kommst da auch drauf.

    und nach weiteren 2 minuten stellt man fest, dass das für float und double nicht funkioniert (im gegensatz zu den versionen die der standard definiert).



  • Nächstes mal schreib ich ein template das für alle typen geht aber da ich ja selber nummeric_limits verwende und keine selbst gebsteelt lib geschrieben hab die das kann hab ich halt nicht gleich alles richtig gemacht. Es geht hier nur um die idee nicht darum das der code absolut richtig ist!

    mfg


  • Mod

    japro schrieb:

    spjoe schrieb:

    BartS wollt wissen wies geht ich habs erm gsagt er hätt glaub ich nicht gefragt wenn er mit der numeric_limits zufrieden gewesen werden und es ist ziemlich leicht in einem tmplate zu verwenden.

    template <class _Ty>
    _Ty Max_Value(){
        return ((_Ty)(~0U>>1))
    }
    

    Was heisst nachprogrammieren. Wennnst 3 minuten nachdenkst kommst da auch drauf.

    und nach weiteren 2 minuten stellt man fest, dass das für float und double nicht funkioniert (im gegensatz zu den versionen die der standard definiert).

    das geht sehr wohl für float und double, schliesslich gibt es auch dafür eine standard.



  • Ja, aber nicht auf diese Weise.



  • spjoe schrieb:

    #define INTMAX ((int)(~0U>>1))
    #define INTMIN  (-INTMAX -1)
    

    Was bedeutet dieses "~0U>>1"? 😕 Das habe ich noch nie gesehen!

    mfg



  • terraner schrieb:

    spjoe schrieb:

    #define INTMAX ((int)(~0U>>1))
    #define INTMIN  (-INTMAX -1)
    

    Was bedeutet dieses "~0U>>1"? 😕 Das habe ich noch nie gesehen!

    mfg

    es bedeuted du hast einen unsigned integer (ohne vorzeichen) mit dem wert 0 den du invertierts (also die Wertigkeit aller bits umdrehst) und um eine Stelle nach rechts schiftest
    ist etwas verwirrend auf den ersten Blick, linux code halt


Anmelden zum Antworten