casting int naar char met C++ stijl casten

In traditionele C kun je het volgende doen:

int i = 48;
char c = (char)i;
//Now c holds the value of 48. 
//(Of course if i > 255 then c will not hold the same value as i).  

Welke van de c++-castingmethoden (static_cast, reinterpret_cast) is geschikt om deze klus te klaren?


Antwoord 1, autoriteit 100%

Je kunt impliciet converteren tussen numerieke typen, zelfs als dat aan precisie inboet:

char c = i;

Het is echter mogelijk dat u compilerwaarschuwingen wilt inschakelen om mogelijk verliesgevende conversies zoals deze te voorkomen. Als je dat doet, gebruik dan static_castvoor de conversie.

Van de andere cast:

  • dynamic_castwerkt alleen voor verwijzingen of verwijzingen naar polymorfe klassentypen;
  • const_castkan geen typen wijzigen, alleen constof volatilekwalificaties;
  • reinterpret_castis voor speciale omstandigheden, converteren tussen verwijzingen of verwijzingen en volledig ongerelateerde typen. Het zal met name geen numerieke conversies uitvoeren.
  • C-stijl en functie-stijl casts doen elke combinatie van static_cast, const_casten reinterpret_castdie nodig is om de klus te klaren.

Antwoord 2, autoriteit 97%

U moet static_cast<char>(i)gebruiken om het gehele getal inaar charte casten.

reinterpret_castzou bijna nooit moeten worden gebruikt, tenzij je een type wilt casten in een fundamenteel ander type.

Ook reinterpret_castis machine-afhankelijk, dus veilig gebruikt het vereist het volledige begrip van de typen en hoe de compiler de cast implementeert.

Voor meer informatie over C++ Casting Zie:


Antwoord 3

reinterpret_castkan niet worden gebruikt voor deze conversie, de code zal niet compileren. Volgens C++ 03 standaard sectie 5.2.10-1:

Conversions that can be performed explicitly using reinterpret_cast are listed below. No other conversion can be performed explicitly using reinterpret_cast.

Deze conversie staat niet in die sectie vermeld. Zelfs dit is ongeldig:

long l = reinterpret_cast<long>(i)

static_castis degene die hier moet worden gebruikt. Zie dit en deze dus vragen.


Antwoord 4

Het gebruik van statische cast zou waarschijnlijk resulteren in zoiets:

// This does not prevent a possible type overflow
const char char_max = -1;
int i = 48;
char c = (i & char_max);

Om het mogelijke overloop van het type te voorkomen, zou u dit kunnen doen:

const char char_max = (char)(((unsigned char) char(-1)) / 2);
int i = 128;
char c = (i & char_max); // Would always result in positive signed values.

Waar reinterpret_cast waarschijnlijk gewoon direct zou worden omgezet in char, zonder enige cast-veiligheid.
-> Gebruik nooit reinterpret_cast als je ook static_cast kunt gebruiken.
Als je tussen klassen cast, zorgt static_cast er ook voor dat de twee typen overeenkomen (het object is een afgeleide van het cast-type).

Als uw object een polymorf type is en u niet weet welk type het is, moet u dynamic_cast gebruiken, die tijdens runtime een typecontrole uitvoert en nullptr retourneert als de typen niet overeenkomen.

ALS je const_cast nodig hebt, heb je waarschijnlijk iets verkeerd gedaan en moet je nadenken over mogelijke alternatieven om de const-correctheid in je code op te lossen.

Other episodes