Maximal/Minimal Int
-
#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
-
Ähm nur mal so ne Frage
Wenn man den kleinsten und grössten Wert wissen will, kann man soch auch sifeof nehmen. Dann hätte man mit if oder ner switch anweisung ja dann die werte
lol, was auch gehen müsste, sind 2 for schleifen ( für ganz hartgesockene )
int i = 0 und dann int x = 0
jetzt solange i++ solange i grösser ist als x
sobald i kleiner ist, einfach i--
und dann int_max = i zuweisen
-
wtf?
-
newkid schrieb:
lol, was auch gehen müsste, sind 2 for schleifen ( für ganz hartgesockene )
int i = 0 und dann int x = 0
jetzt solange i++ solange i grösser ist als x
sobald i kleiner ist, einfach i--
und dann int_max = i zuweiseni++ solange i groesser x ist ... i = 0, x = 0
-
er meint sowas:
int i=0; for(int x=0;x>=i;++x){ i=x; }
ist aber nich grad schön.
-
ich wuesste nicht was daran platformabhängig ist..
ürigens dieser code ist in der kernel.h von linux definiertinterne darstellung negativer Zahlen:
- Einerkomplement
- mit Bias
- niederwertiges Bit
- Trits (3-state-bits)(bin mir nicht bei allen 100% sicher, obs vielleicht doch klappt.)
Zweierkomplement (für das obiger Code funktioniert) ist aus verschiedenen Gründen gängig.
-
otze schrieb:
er meint sowas:
ist aber nich grad schön.
jep genau so was mein ich
jep sagte ja auch fuer "hartgesockene" ( d.h. nicht grad zu emp. )
und wie ist das mit dem sizeof? denn rückgabe sind ja byte und dann mit switch ausrechnen? ( das war der ernstgemeinte vorschlag )