Casting de `int` à `unsigned char`
Je suis en cours d'exécution le code C++ suivant sur Coliru:
#include <iostream>
#include <string>
int main()
{
int num1 = 208;
unsigned char uc_num1 = (unsigned char) num1;
std::cout << "test1: " << uc_num1 << "\n";
int num2 = 255;
unsigned char uc_num2 = (unsigned char) num2;
std::cout << "test2: " << uc_num2 << "\n";
}
Je suis de sortie:
test1: �
test2: �
C'est un exemple simplifié de mon code.
Pourquoi n'est-ce pas imprimer:
test1: 208
test2: 255
Suis-je abuser std::cout
, ou ne suis-je pas faire le casting correctement?
Plus de fond
Je veux convertir de int
à unsigned char
(plutôt que unsigned char*
). Je sais que tous mes nombres entiers entre 0 et 255 parce que je suis de les utiliser dans le modèle de couleur RGBA.
Je veux utiliser LodePNG pour coder des images. La bibliothèque dans example_encode.cpp
utilise unsigned char
s dans std::vector<unsigned char>& image
:
//Example 1
//Encode from raw pixels to disk with a single function call
//The image argument has width * height RGBA pixels or width * height * 4 bytes
void encodeOneStep(const char* filename, std::vector<unsigned char>& image, unsigned width, unsigned height)
{
//Encode the image
unsigned error = lodepng::encode(filename, image, width, height);
//if there's an error, display it
if(error) std::cout << "encoder error " << error << ": "<< lodepng_error_text(error) << std::endl;
}
std::cin::operator<<(unsigned char)
imprime le caractère de la représentation, il suffit de fairestd::cout << num1
si vous voulez un entier.- Je suis d'imprimer les documents pour vérifier que la conversion travaillé. Je veux convertir l'entier à un unsigned char, donc je peux passer le unsigned char dans le
encodeOneStep
fonction dans le LodePNG de la bibliothèque. - lire ce.
- Merci pour le lien, qui est la façon dont les personnages apparaissent dans le format ASCII lorsqu'il est passé à
cout
. Il ne veut pas me dire si mon plâtre deint
àunsigned char
est la bonne façon d'aborder ce problème. Voulez-vous confirmer que c'est la bonne façon? - Il n'est évidemment pas de la bonne façon, étant donné qu'au lieu de vous dire ce que vous voulez savoir, il a confondu vous.
Vous devez vous connecter pour publier un commentaire.
std::cout est correct =)
Appuyez sur ALT, puis 2 0 8
C'est le char que vous imprimez avec test1. La console pourrait ne pas savoir comment imprimer correctement de sorte qu'il sorties le point d'interrogation. Même chose avec 255. Après la lecture de la png et de le mettre dans le std::vector, il n'est pas d'usage de l'écrit à l'écran. Ce fichier contient des données binaires qui n'est pas accessible en écriture.
Si vous voulez voir "208" et "255", vous ne devriez pas les convertir en unsigned char d'abord, ou indiquez que vous souhaitez imprimer des numéros de type int par exemple, à l'instar de ce
Vous êtes à la recherche à un cas particulier de std::cout qui n'est pas facile à comprendre au premier abord.
Quand std::cout est appelé, il vérifie le type de la main droite à côté de l'opérande. Dans votre cas,
std::cout << uc_num1
raconte cout que l'opérande est un unsigned char, afin de ne pas effectuer une conversion, car unsigned char sont généralement imprimable. Essayez ceci :Si vous écrivez
std::cout << num1
, puis cout rendrez compte que vous êtes l'impression d'un int. Il va alors transformer l'int en string et imprimer cette chaîne pour vous.Vous voudrez peut-être consulter sur le c++ de surcharge d'opérateur pour comprendre comment il fonctionne, mais il n'est pas super crucial pour le moment, vous avez juste besoin de réaliser que std::cout peuvent se comporter différemment pour les différents type de données que vous essayez d'imprimer.