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.