2017-08-25 3 views
0

Je possède ce morceau de code:C++ - Attribution int char puis attribuer ombles à un autre int

#include <stdio.h> 
#include <iostream> 
int main(int n, char** args) 
{ 
    int i = 140; 
    char c = i; 
    int j = c; 
    printf("%d", j); 
    system("pause"); 
} 

Sortie:

-116

Si je comprends bien, char c = i affecterait le caractère qui a le code ASCII 140 à c, mais je me demande ce qui s'est passé lors de l'attribution int j = c; après cela et où -116 la valeur vient?

si je change char c = i; en unsigned char c = i; alors la sortie est 140. Y at-il de toute façon pour obtenir la valeur de j égale à 140 si je n'utilise pas unsigned ici? (Supposé que i> = 0 et i < = 255)

Répondre

1

Le range of values for an unsigned char sont [0,255] compris - mais la gamme de valeurs pour un produit de carbonisation signés sont [-128,127] inclus.

La valeur de 140 est en dehors de la plage du caractère signé, de sorte qu'elle déborde et passe à -116. Au moins, c'est ce qui semble se produire - le débordement d'un entier signé est undefined behaviour.

Il n'y a vraiment aucun moyen d'éviter cela sans utiliser unsigned char ou une alternative plus grande à char - vous essayez simplement de représenter une valeur qui ne peut pas être représentée par ce type.