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.

1voto

Rasmus Kaj Points 2102

Un caractère n'a (généralement) que 8 bits, ce qui signifie que vous ne pouvez pas stocker des valeurs aussi grandes que 3000 (ce qui nécessiterait au moins 10 000 caractères). 11 12 bits). Donc, si vous essayez de stocker 3000 dans un octet, il sera simplement enveloppé.

Comme 3000 est 0xBBA, il nécessite deux octets, un 0x0B et un 0xBA. Si vous essayez de le stocker dans un seul octet, vous n'en obtiendrez qu'un seul (0xBA). Et comme un octet est (généralement) signé, cela fait -72.

1voto

goldPseudo Points 2479

Comme spécifié, la valeur hexagonale 16 bits de 3000 est 0x0BB8 . Bien que spécifique à la mise en œuvre D'après les résultats que vous avez affichés, il est probablement stocké en mémoire dans des paires de 8 bits sous la forme suivante B8 0B (certaines architectures le stockent en tant que 0B B8 . C'est ce qu'on appelle endiveté .)

char d'autre part, n'est probablement pas un type 16 bits. Encore une fois, c'est spécifique à la mise en œuvre mais d'après les résultats que vous avez affichés, il semble que ce soit 8 bits, ce qui n'est pas rare.

Ainsi, alors que votre programme a alloué 8 bits de mémoire pour votre valeur, vous stockez deux fois plus d'informations dans cette mémoire. Lorsque votre programme récupérera cette valeur plus tard, il n'extraira que le premier octet stocké, dans ce cas-ci B8 . Le site 0B sera ignorée, et pourrait causer des problèmes plus tard s'il finissait par écraser quelque chose d'important. C'est ce qu'on appelle un dépassement de tampon ce qui est très mauvais.

En supposant que complément à deux (techniquement spécifique à la mise en œuvre mais une hypothèse raisonnable), la valeur hexadécimale de B8 se traduit soit par -72 o 184 en décimal, selon que l'on a affaire à une signé o non signé type. Puisque vous n'avez spécifié ni l'un ni l'autre, votre compilateur choisira le type par défaut. Encore une fois, c'est spécifique à la mise en œuvre et il semble que votre compilateur utilise caractères signés .

Par conséquent, vous obtenez -72 . Mais ne vous attendez pas à obtenir les mêmes résultats sur un autre système.

-2voto

igul222 Points 3395

char est utilisé pour contenir un seul caractère, et vous essayez de stocker un code à 4 chiffres. int en un. Peut-être vouliez-vous utiliser un tableau de caractères, ou une chaîne de caractères ( char t[4] dans ce cas).

Pour convertir un int en une chaîne de caractères (non testé) :

#include <stdlib.h>

int main() {
    int num = 3000;
    char numString[4];
    itoa(num, buf, 10);
}

-6voto

Omu Points 17372

Oh, j'ai compris, c'est débordement c'est comme si le char était seulement de -256 à 256 ou quelque chose comme ça, je ne suis pas sûr, comme si vous avez une var dont la limite maximale du type est 256 et que vous ajoutez 1, alors elle devient -256 et ainsi de suite.

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