Skip to content

Floating-Point, Caratteri e Booleani

Oltre ai numeri interi, il C++ dispone di tipi fondamentali per modellare numeri reali, testo e stati logici.

I tipi floating-point memorizzano approssimazioni di numeri reali (es. 3.14 o 98.6). Poiché la memoria del computer è finita, è impossibile rappresentare numeri reali con precisione infinita (come il Pi greco). Il C++ offre tre livelli di precisione (basati generalmente sullo standard IEEE 754):

  • float: singola precisione (tipicamente 4 byte).
  • double: doppia precisione (tipicamente 8 byte). La scelta predefinita e più sicura.
  • long double: precisione estesa.

I letterali con punto decimale sono per default di tipo double. Per forzare un float, aggiungi il suffisso f o F (es. 3.14f). Per usare la notazione scientifica, usa la lettera e (es. 6.022e23 per il numero di Avogadro).

Gli specificatori di formato per printf:

  • %f ➔ Formato decimale classico.
  • %e ➔ Formato scientifico.
  • %g ➔ Il compilatore sceglie automaticamente la versione più compatta tra %f e %e.

I tipi carattere memorizzano dati testuali. Il C++ moderno dispone di diverse varianti per supportare alfabeti complessi (Unicode):

  • char: il tipo di default (1 byte). Perfetto per l’inglese e la tabella ASCII standard. Può essere signed o unsigned.
  • char16_t e char32_t: caratteri larghi (wide characters) necessari per le codifiche UTF-16 e UTF-32.
  • wchar_t: progettato per contenere il carattere più largo supportato dal locale del sistema operativo.

I letterali carattere (character literals) sono racchiusi tra apici singoli ('a'). Per dichiarare un carattere Unicode specifico, si utilizzano i prefissi:

  • L'Z' genera un wchar_t.
  • u'\u0041' genera un char16_t (il codice \u è seguito da 4 cifre esadecimali, in questo caso la ‘A’).
  • U'\U0001F37A' genera un char32_t (il codice \U è seguito da 8 cifre, utile ad esempio per le Emoji come il boccale di birra 🍺).

Lo specificatore base per printf è %c, mentre per i wchar_t si usa %lc.

ASCII ed Escape Sequences (Codici di Controllo)

Section titled “ASCII ed Escape Sequences (Codici di Controllo)”

Lo standard ASCII (American Standard Code for Information Interchange), risalente agli anni ‘60, assegna i numeri interi da 0 a 127 a caratteri specifici:

  • I codici da 32 a 127 sono i caratteri “stampabili” (alfabeto, numeri, punteggiatura).
  • I codici da 0 a 31 sono i codici di controllo. Erano usati per comandare dispositivi fisici come stampanti ad aghi o macchine a nastro magnetico (es. BELL faceva suonare una campanella hardware).

Alcuni codici di controllo sopravvivono in C++ sotto forma di sequenze di escape, precedute dal backslash \:

  • \n : Line Feed (Ritorno a capo)
  • \r : Carriage Return (Riporta il cursore all’inizio della riga)
  • \t : Tabulazione (Tab)
  • \0 : Carattere Null (0 decimale, usato in C/C++ come terminatore delle stringhe)
  • \a : Alert (il vecchio BELL)

Il tipo bool può assumere esclusivamente due stati: true (vero) e false (falso).

In C++, i tipi interi e i booleani sono strettamente collegati:

  • true viene promosso a 1, false a 0.
  • Regola vitale: qualsiasi numero intero diverso da zero viene convertito tacitamente in true. Solo 0 equivale a false.

Poiché non esiste uno specificatore printf esclusivo per i bool, li si stampa come interi tramite %d.

Gli operatori logici permettono di combinare più espressioni booleane:

  • ! (NOT unario): inverte lo stato (!true diventa false).
  • && (AND logico): restituisce true solo se entrambi gli operandi sono veri.
  • || (OR logico): restituisce true se almeno uno degli operandi è vero.

Prova a utilizzare le tue conoscenze dei caratteri e dei cicli per stampare l’alfabeto minuscolo. Ricorda che i caratteri sono in realtà numeri interi sotto il cofano!

I programmatori di sistema spesso manipolano la memoria grezza (raw memory). Prima del C++17 si utilizzavano array di unsigned char o char per simulare i byte grezzi. Ora esiste std::byte (in <cstddef>). A differenza di un char, std::byte non è né un numero né un carattere: non puoi farci addizioni matematiche, puoi unicamente applicarvi operatori logici bit-a-bit. Questo lo rende estremamente sicuro da usare. Il prefisso std:: indica che fa parte del namespace della Libreria Standard.

Il tipo void, infine, rappresenta un set di valori vuoto. Si utilizza principalmente per indicare che una funzione “non restituisce nulla” al chiamante.