std::hex în C++

Formatare C++98

Afișează și citește numerele întregi în baza 16 (hex), 8 (oct) sau 10 (dec).

Sintaxă
#include <iomanip>
std::cout << std::hex << numar;  // baza 16
std::cout << std::oct << numar;  // baza 8
std::cout << std::dec << numar;  // baza 10

Ce face std::hex

std::hex, std::oct și std::dec schimbă baza în care un flux scrie și citește numerele întregi. Schimbarea rămâne activă până alegi altă bază, deci după std::hex trebuie să revii cu std::dec.

std::showbase adaugă prefixul bazei (0x pentru 16, 0 pentru 8), iar std::uppercase scrie cifrele hexazecimale cu majuscule. Numerele reale nu sunt afectate de hex.

La citire, std::cin >> std::hex >> x interpretează textul ff ca 255. Pentru baza 2 nu există manipulator; folosește std::format("{:b}", x) sau std::bitset.

Exemple

Exemplul 1: Același număr în trei baze

#include <iomanip>
#include <iostream>

int main() {
    int n = 255;
    std::cout << "zecimal:      " << std::dec << n << '\n';
    std::cout << "hexazecimal:  " << std::hex << n << '\n';
    std::cout << "octal:        " << std::oct << n << '\n';
    std::cout << std::showbase << std::uppercase;
    std::cout << "cu prefix:    " << std::hex << n << ' ' << std::oct << n << '\n';
    std::cout << std::dec << "înapoi:       " << n << '\n';
}

Rezultat

zecimal:      255
hexazecimal:  ff
octal:        377
cu prefix:    0XFF 0377
înapoi:       255

Exemplul 2: Culori RGB în hexazecimal

setw(2) și setfill('0') păstrează două cifre pentru fiecare componentă.

#include <iomanip>
#include <iostream>

int main() {
    int rosu = 255, verde = 165, albastru = 0;
    std::cout << "Portocaliu: #" << std::hex << std::setfill('0')
              << std::setw(2) << rosu << std::setw(2) << verde << std::setw(2) << albastru
              << std::dec << '\n';
}

Rezultat

Portocaliu: #ffa500

Exemplul 3: Citirea unui număr hexazecimal

#include <iomanip>
#include <iostream>
#include <sstream>

int main() {
    std::istringstream text("ff 1a");
    int a, b;
    text >> std::hex >> a >> b;
    std::cout << a << " si " << b << '\n';
}

Rezultat

255 si 26

Greșeli frecvente

  • Uiți să revii la std::dec: toate numerele afișate după aceea apar în baza 16 și par greșite.
  • Afișezi un char cu std::hex și vezi tot litera, nu codul ei. Convertește-l întâi: static_cast<int>(static_cast<unsigned char>(c)).

Comenzi înrudite

  • std::setw: Stabilește lățimea minimă a următoarei valori, cu aliniere și caracter de umplere.
  • std::format: Construiește un std::string dintr-un șablon cu acolade {} și valori (C++20).
  • std::showpos: Afișează semnul + în fața numerelor pozitive (și a lui zero).
  • std::to_chars: Scrie un număr ca text într-un tablou de char, foarte rapid, fără alocări și fără excepții.