2 votes

C convertir un int en char

J'ai un code simple

char t = (char)(3000) ;

Alors la valeur de t est -72. La valeur hexagonale de 3000 est 0xBB8. Je ne comprends pas pourquoi la valeur de t est -72.

Merci pour vos réponses.


Je ne sais pas pour Mac. Mon résultat est donc de -72. Comme je le sais, le MAC utilise le Big Endian, cela affecte-t-il le résultat ? Je n'ai pas d'ordinateur MAC à tester, donc je veux savoir ce que les gens de MAC en pensent.

12voto

Artelius Points 25772

La valeur hexagonale de 3000 est 0xBB8.

Ainsi, la valeur hexadécimale du caractère (qui, soit dit en passant, semble être signé dans votre compilateur) est 0xB8.

S'il était non signé, 0xB8 serait 184. Mais comme il est signé, sa valeur réelle est inférieure de 256, c'est-à-dire -72.

Si vous voulez savoir pourquoi, lisez ce qui suit complément à deux la notation.

6voto

julesrif Points 11

0xB8 en tant que caractère signé est -72 en décimal. La transformation de l'int (0x0BB8) en char consiste à supprimer les bits de poids fort et à laisser les 8 bits de poids faible (0xB8).

4voto

brianreavis Points 6351

A char est de 8 bits (ce qui ne peut représenter qu'une plage de 0 à 255). En essayant d'exprimer 3000 à un char est... impossible impossible, du moins pour ce que vous envisagez.

3voto

Justin Johnson Points 16243

Cela se produit parce que 3000 est une valeur trop grande et provoque un débordement. L'omble est généralement de -128 à 127 signé, ou de 0 à 255 non signé, mais il peut changer en fonction de l'implémentation.

2voto

AndreyT Points 139512

char est un type intégral avec une certaine gamme de valeurs représentables. int est également un type intégral avec une certaine gamme de valeurs représentables. Normalement, la gamme de int est [beaucoup] plus large que celle de char . Quand vous essayez de vous serrer dans un char un int qui n'entre pas dans la plage de valeurs de l'option char la valeur ne sera pas "adaptée", bien sûr. Le résultat réel est défini par l'implémentation.

Dans votre cas 3000 est un int valeur qui n'entre pas dans la plage de char sur votre mise en œuvre. Donc, vous n'obtiendrez pas 3000 comme résultat. Si vous voulez vraiment savoir pourquoi il est spécifiquement sorti comme -72 - Consultez la documentation fournie avec votre implémentation.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X