Gegevenstypebereiken en hun macro's in C++
Bij competitief programmeren is het meestal nodig om aan de variabele de maximale of minimale waarde toe te wijzen die het gegevenstype kan bevatten, maar het onthouden van zo'n groot en nauwkeurig getal blijkt een lastige klus. Daarom heeft C++ bepaalde macro's om deze getallen weer te geven, zodat deze direct aan de variabele kunnen worden toegewezen zonder daadwerkelijk het hele getal te typen.
De
Laten we eens een voorbeeld bekijken:
C++ #include // for int char macros #include // for float double macros #include using namespace std ; int main () { // Displaying ranges with the help of macros cout < < 'char ranges from: ' < < CHAR_MIN < < ' to ' < < CHAR_MAX < < endl ; cout < < ' n nshort int ranges from: ' < < SHRT_MIN < < ' to ' < < SHRT_MAX < < endl ; cout < < ' n int ranges from: ' < < INT_MIN < < ' to ' < < INT_MAX < < endl ; cout < < ' n long int ranges from: ' < < LONG_MIN < < ' to ' < < LONG_MAX < < endl ; cout < < ' n float ranges from: ' < < FLT_MIN < < ' to ' < < FLT_MAX < < endl ; return 0 ; }
Uitvoer
char ranges from: -128 to 127
nshort int ranges from: -32768 to 32767
int ranges from: -2147483648 to 2147483647
long int ranges from: -9223372036854775808 to 9223372036854775807
float ranges from: 1.17549e-38 to 3.40282e+38Gegevenstypen en hun bereikmacro's
Hieronder vindt u een lijst met enkele gegevenstypemacro's:
| Gegevenstype | Bereik | Macro voor minimale waarde | Macro voor maximale waarde |
|---|---|---|---|
| verkoold | -128 tot +127 | Char_min | CHAR_MAX |
| korte char | -128 tot +127 | SCHAR_MIN | SCHAR_MAX |
| niet-ondertekend teken | 0 tot 255 | -- | Vliegen_max |
| korte int | -32768 tot +32767 | SHRT_MIN | SHRT_MAX |
| niet-ondertekende korte int | 0 tot 65535 | -- | USHRT_MAX |
| int | -2147483648 tot +2147483647 | INT_MIN | INT_MAX |
| niet ondertekend int | 0 tot 4294967295 | -- | UINT_MAX |
| lang int | -9223372036854775808 tot +9223372036854775807 | LONG_MIN | LONG_MAX |
| niet-ondertekend lange int | 0 tot 18446744073709551615 | -- | Gebruiksong_Max |
| lang lang int | -9223372036854775808 tot +9223372036854775807 | Verzendmin | LLONG_MAX |
| niet ondertekend lang lang int | 0 tot 18446744073709551615 | -- | ULLONG_MAX |
| vlot | 1,17549e-38 tot 3,40282e+38 | Flt_min | FLT_MAX |
| zweven (negatief) | -1,17549e-38 tot -3,40282e+38 | -Lt_min | -FLT_MAX |
| dubbele | 2.22507e-308 tot 1.79769e+308 | DBL_MIN | DBL_MAX |
| dubbel (negatief) | -2,22507e-308 tot -1,79769e+308 | -DBL_MIN | -DBL_MAX |
Limieten voor gegevenstypen in modern C++
De bovenstaande macrobenadering voor de boven- en ondergrenzen van het gegevenstype is de oude C-taalbenadering, geërfd door C++. Maar C++ heeft ook zijn eigen methode om programmeurs van dezelfde informatie te voorzien.
C++ biedt de numerieke_limieten <> class-sjabloon als een modern alternatief voor deze macro's. Deze sjabloon biedt een meer objectgeoriënteerde benadering voor toegang tot gegevenstypelimieten. Het wordt gedefinieerd binnen de
Laten we eens een voorbeeld bekijken:
C++ #include #include using namespace std ; int main () { // Displaying ranges with the help of macros cout < < 'short int ranges from: ' < < numeric_limits < short int >:: min () < < ' to ' < < numeric_limits < short int >:: max () < < endl ; cout < < ' n int ranges from: ' < < numeric_limits < int >:: min () < < ' to ' < < numeric_limits < int >:: max () < < endl ; cout < < ' n long int ranges from: ' < < numeric_limits < long >:: min () < < ' to ' < < numeric_limits < long >:: max () < < endl ; cout < < ' n float ranges from: ' < < numeric_limits < float >:: min () < < ' to ' < < numeric_limits < float >:: max () < < endl ; return 0 ; }
Uitvoer
short int ranges from: -32768 to 32767
int ranges from: -2147483648 to 2147483647
long int ranges from: -9223372036854775808 to 9223372036854775807
float ranges from: 1.17549e-38 to 3.40282e+38Het wordt aanbevolen om deze aanpak te gebruiken om de boven- en ondergrenzen van het gegevenstype te vinden in plaats van macro's, omdat deze veiliger en leesbaarder zijn in vergelijking met de op macro's gebaseerde aanpak.