Maximal/Minimal Int
-
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
- wenn du das schon nachcodest, kannst es gleich auch richtig machen und const int verwenden ..
- 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
-
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
-
Danke!
Gibt es noch mehr solcher Anweisungen und wenn ja, wo finde ich so etwas wie eine Referenz? Ich habe zwar schon nach "preprocessor commands" und "preprocessor c++" gesucht, aber nichts gefunden.mfg
-
Du solltest nach "Bit Operationen" suchen.
-
Merci!
mfg
-
@spoje:
Konstruktive Kritik:Dein Code ist Platformabhängig, und funktioniert nur bei "üblicher" Darstellung von signed int im Zeierkomplement. Das ist vom Standard nicht garantiert. (Einerkomplement ist zwar nicht sehr sinnvoll und Bias nicht sehr verbreitet, aber es hat schon seltsameres einen C-Compielr gesehen)
limits.h / std::limits sind ja grad dazu da, diese Platformabhängigkeit zu isolieren. Insofern dürfen Standardheader total unportabel sein
-
peterchen schrieb:
Insofern dürfen Standardheader total unportabel sein
Nein. Sie sollen sogar!
-
peterchen schrieb:
@spoje:
Konstruktive Kritik:Dein Code ist Platformabhängig, und funktioniert nur bei "üblicher" Darstellung von signed int im Zweierkomplement. Das ist vom Standard nicht garantiert.
ich wuesste nicht was daran platformabhängig ist..
ürigens dieser code ist in der kernel.h von linux definiert