Siirry sisältöön

C/Standardikirjastot/stdint.h

Wikikirjastosta
#include <stdint.h>

[Lisätty C99-standardissa]

Määrittelee uusia kokonaislukutietotyyppejä ja lisäksi lisämakroja, joista selviää joidenkin tietotyyppien rajat (jotka eivät selviä limits.h:lla).

Uusia kokonaislukutyyppejä on kahdenlaisia: vakiopituiset ja muut.

Vakiopituinen etumerkillinen kokonaislukutyyppi intN_t, missä N on 8, 16, 32, tai 64, täyttää nämä ehdot:

  • tietotyypissä on tasan N bittiä
  • kaikki N bittiä ovat merkitseviä
  • negatiiviset luvut ilmaistaan kahden komplementilla
  • pienin arvo on –2N–1
  • suurin arvo on 2N–1 – 1

Vakiopituinen etumerkitön kokonaislukutyyppi uintN_t, missä N on 8, 16, 32, tai 64, täyttää nämä ehdot:

  • tietotyypissä on tasan N bittiä
  • kaikki N bittiä ovat merkitseviä
  • suurin arvo on 2N – 1

Vakiopituista tietotyyppiä ei välttämättä ole määritelty, jos kääntäjä ei pysty toteuttamaan sitä kohdealustalla. Tällöin myöskään rajamakroja ei määritellä, joten voidaan tarkistaa esikääntäjän tasolla, että tietotyypit ovat olemassa.

Tietotyyppi Selite Minimiarvo Maksimiarvo
uint8_t Etumerkitön 8-bittinen kokonaisluku 0 UINT8_MAX = 28 – 1 = +255
int8_t Etumerkillinen 8-bittinen kokonaisluku INT8_MIN = –27 – 1 = –128 INT8_MAX = 27 – 1 = +127
uint16_t Etumerkitön 16-bittinen kokonaisluku 0 UINT16_MAX = 216 – 1 = +65535
int16_t Etumerkillinen 16-bittinen kokonaisluku INT16_MIN = –215 – 1 = –32768 INT16_MAX = 215 – 1 = +32767
uint32_t Etumerkitön 32-bittinen kokonaisluku 0 UINT32_MAX = 232 – 1 = +4294967295
int32_t Etumerkillinen 32-bittinen kokonaisluku INT32_MIN = –231 – 1 = –2147483648 INT32_MAX = 231 – 1 = +2147483647
uint64_t Etumerkitön 64-bittinen kokonaisluku 0 UINT64_MAX = 264 – 1 = +18446744073709551615
int64_t Etumerkillinen 64-bittinen kokonaisluku INT64_MIN = –263 – 1 = –9223372036854775808 INT64_MAX = 263 – 1 = +9223372036854775807

Varsinaisten vakiopituisten tyyppien lisäksi jokaisella tyypillä on myös fast- ja least-versiot, esimerkiksi uint32_tuint_fast32_t, uint_least32_t. Standardi takaa, että nämä tietotyypit on aina saatavilla, toisin kuin varsinaiset vakiopituiset tietotyypit. least-tyyppi on pienin sopiva kokonaislukutyyppi, jossa on vähintään N bittiä; fast-tyyppi on vähintään N bittistä sisältävistä kokonaislukutyypeistä se, joka on kääntäjän mielestä nopein. fast- ja least-tietotyypeille ei taata, että negatiiviset luvut ilmaistaisiin kahden komplementilla, joten niiden arvoalue voi olla vakiopituisia tietotyyppejä hieman pienempi.

fast- ja least-tyypeille on saatavilla myös rajat, esim. uint_fast32_t:lla UINT_FAST32_MAX, int_fast32_t:lla INT_FAST32_MIN ja INT_FAST32_MAX.

Muut stdint.h:n uudet tietotyypit ovat:

intmax_t
uintmax_t
intptr_t
uintptr_t

intmax_t on etumerkillisistä kokonaislukutyypeistä se, jonka esitettävä arvoalue on laajin. uintmax_t on etumerkittömistä kokonaislukutyypeistä se, jonka esitettävä arvoalue on laajin.

intptr_t on etumerkillinen kokonaislukutyyppi, johon mahtuu mikä tahansa (arvo-)osoittimen mahdollinen arvo eli muistiosoite. uintmax_t on etumerkillinen kokonaislukutyyppi, johon mahtuu mikä tahansa (arvo-)osoittimen mahdollinen arvo eli muistiosoite.

Näille tyypeille määritellään myös rajat:

Tietotyyppi Minimiarvon makro on pienempi
tai yhtä kuin
Maksimiarvon makro on suurempi
tai yhtä kuin
Huomiot
intmax_t INTMAX_MIN -9223372036854775807 INTMAX_MAX +9223372036854775807
uintmax_t = 0 UINTMAX_MAX +18446744073709551615
intptr_t INTPTR_MIN -32767 INTPTR_MAX +32767
uintptr_t = 0 UINTPTR_MAX +65535

Lisärajat, joita ei ole limits.h:ssa:

Nimi Raja Selite
SIZE_MAX ≥ +65535 size_t:n suurin mahdollinen arvo
PTRDIFF_MIN ≤ -65535 ptrdiff_t:n pienin mahdollinen arvo
PTRDIFF_MAX ≥ +65535 ptrdiff_t:n suurin mahdollinen arvo
SIG_ATOMIC_MIN = 0 (jos sig_atomic_t etumerkitön)

≤ -127 (jos sig_atomic_t etumerkillinen)

sig_atomic_t:n pienin mahdollinen arvo
SIG_ATOMIC_MAX ≥ +255 (jos sig_atomic_t etumerkitön)

≥ +127 (jos sig_atomic_t etumerkillinen)

sig_atomic_t:n suurin mahdollinen arvo
WCHAR_MIN = 0 (jos wchar_t etumerkitön)

≤ -127 (jos wchar_t etumerkillinen)

wchar_t:n pienin mahdollinen arvo
WCHAR_MAX ≥ +255 (jos wchar_t etumerkitön)

≥ +127 (jos wchar_t etumerkillinen)

wchar_t:n suurin mahdollinen arvo
WINT_MIN = 0 (jos wint_t etumerkitön)

≤ -32767 (jos wint_t etumerkillinen)

wint_t:n pienin mahdollinen arvo
WINT_MAX ≥ +65536 (jos wint_t etumerkitön)

≥ +32767 (jos wint_t etumerkillinen)

wint_t:n suurin mahdollinen arvo


stdint.h on yksi harvoista otsikkotiedostoista, joka on saatavilla myös ns. irrallisessa (engl. freestanding) ympäristössä. Tämä tarkoittaa sitä, että otsikkotiedoston määritelmät ovat kääntäjän tiedossa heti jo ohjelmaa kääntäessä, eikä se sisällä funktioita tai muuttujia. Irrallisia ympäristöjä ovat sellaiset, joissa ei ole saatavilla suoritettavaa C-standardikirjaston toteutusta.