Maison >développement back-end >C++ >Pourquoi `cout` imprime-t-il des caractères inattendus lors de la gestion de `unsigned char` alors que `printf` ne le fait pas ?

Pourquoi `cout` imprime-t-il des caractères inattendus lors de la gestion de `unsigned char` alors que `printf` ne le fait pas ?

Patricia Arquette
Patricia Arquetteoriginal
2024-12-04 10:44:10538parcourir

Why Does `cout` Print Unexpected Characters When Handling `unsigned char` While `printf` Doesn't?

Dévoilement du mystère derrière le comportement imprévisible de cout avec des caractères non signés

En programmation, une sortie inattendue peut souvent conduire à de la frustration et de la confusion. Considérons le code suivant :

#include<iostream>
#include<stdio.h>

using namespace std;

int main() {
    unsigned char a;
    a = 1;
    printf("%d", a);
    cout << a;
}

Ce code est conçu pour imprimer la valeur stockée dans la variable char non signée 'a', qui est 1. Cependant, une fois exécuté, il imprime "1" suivi de quelques éléments apparemment personnages aléatoires. Pourquoi cout se comporte-t-il différemment de printf dans ce scénario ?

La réponse réside dans la nature du caractère non signé. Les caractères ASCII attribués aux valeurs 0 à 31 sont considérés comme non imprimables. Le caractère affecté à la valeur 1 est un caractère non imprimable, qu'il est de toute façon possible de tenter d'imprimer. Pour déterminer si un caractère est imprimable, vous pouvez utiliser la fonction std::isprint :

std::cout << std::isprint(a) << std::endl;

Cette instruction affichera 0 (faux), indiquant que le caractère n'est pas imprimable.

Pour résoudre ce problème et forcer cout à imprimer la valeur de a comme 1, vous pouvez le convertir en un entier non signé :

cout << static_cast<unsigned>(a) << std::endl;

Ceci cast convertit le caractère non imprimable en sa valeur entière non signée correspondante, garantissant que cout imprime 1 correctement.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn