std::int32_t în C++

Tipuri întregi cu mărime exactă: int32_t are mereu 32 de biți, uint8_t 8 biți fără semn etc.

Sintaxă
#include <cstdint>
std::int8_t  std::int16_t  std::int32_t  std::int64_t
std::uint8_t std::uint16_t std::uint32_t std::uint64_t

Ce face std::int32_t

Standardul C++ nu fixează mărimea lui int sau long: long are 64 de biți pe Linux și macOS, dar 32 pe Windows. Tipurile din <cstdint> au mărimea scrisă în nume: std::int32_t are exact 32 de biți (de la −2.147.483.648 la 2.147.483.647), std::int64_t 64 de biți, std::uint8_t 8 biți fără semn (0–255).

Folosește-le când mărimea contează: formate de fișiere, protocoale de rețea, culori (uint8_t pentru R, G, B), sume mari de bani în bani (int64_t).

std::uint8_t este de fapt un unsigned char, așa că std::cout îl afișează ca literă. std::println îl afișează ca număr.

Ce returnează

Tipuri de date (alias-uri pentru tipurile întregi potrivite ale platformei).

Exemple

Exemplul 1: Mărimi și limite

#include <cstdint>
#include <limits>
#include <print>

int main() {
    std::println("int32_t: {} octeți, max {}", sizeof(std::int32_t), std::numeric_limits<std::int32_t>::max());
    std::println("int64_t: {} octeți, max {}", sizeof(std::int64_t), std::numeric_limits<std::int64_t>::max());
    std::println("uint8_t: {} octet, interval 0..{}", sizeof(std::uint8_t), std::numeric_limits<std::uint8_t>::max());

    std::int64_t populatieMondiala = 8'100'000'000;   // nu încape în int32_t
    std::println("populație: {}", populatieMondiala);
}

Rezultat

int32_t: 4 octeți, max 2147483647
int64_t: 8 octeți, max 9223372036854775807
uint8_t: 1 octet, interval 0..255
populație: 8100000000

Exemplul 2: Culori RGB și capcana cu cout

Pentru std::cout, uint8_t este un caracter: valoarea 65 apare ca litera A. Conversia la int rezolvă problema.

#include <cstdint>
#include <iostream>
#include <print>

struct Culoare {
    std::uint8_t r, g, b;
};

int main() {
    Culoare albastru{0, 102, 204};
    std::println("rgb({}, {}, {})", albastru.r, albastru.g, albastru.b);

    std::uint8_t x = 65;
    std::cout << "cu cout: " << x << ", cu conversie: " << static_cast<int>(x) << '\n';

    std::uint8_t maxim = 255;
    maxim += 1;   // tipurile fără semn se rotesc
    std::println("255 + 1 în uint8_t = {}", maxim);
}

Rezultat

rgb(0, 102, 204)
cu cout: A, cu conversie: 65
255 + 1 în uint8_t = 0

Greșeli frecvente

  • Afișezi un std::uint8_t sau std::int8_t cu std::cout și obții un caracter ciudat. Convertește la int înainte de afișare.
  • Depășești un std::int32_t (de exemplu înmulțind două valori mari). Depășirea tipurilor cu semn este comportament nedefinit; folosește std::int64_t pentru rezultate mari.

Comenzi înrudite

  • std::size_t: Tip întreg fără semn pentru mărimi și indici: îl returnează sizeof și metodele size() ale containerelor.
  • std::numeric_limits: Dă proprietățile unui tip numeric: valoarea maximă și minimă, precizia, dacă are semn, infinitul.
  • int: Tipul de bază pentru numere întregi (fără zecimale), de obicei pe 4 octeți, cu valori între aproximativ -2,1 și 2,1 miliarde.
  • std::in_range: Verifică dacă un număr întreg încape în alt tip întreg, fără capcanele conversiilor cu semn.