Bonjour,
je voudrais savoir s'il existe un tableau permettant de savoir quel type donnera l'addition de 2 types différents.
Par exemple, si j'ai :
long int li = 1L;
unsigned int ui = 1U;
Quel est le type de li + ui ?
Bonjour,
je voudrais savoir s'il existe un tableau permettant de savoir quel type donnera l'addition de 2 types différents.
Par exemple, si j'ai :
long int li = 1L;
unsigned int ui = 1U;
Quel est le type de li + ui ?
Hello,
Peut-être, essayer table + integer promotions + C language sous Google. Dans le même temps, c'est difficile à savoir et cela dépend de l'implémentation, il y a bien des règles de conversions, mais par exemple de nos jours int et long int sont bien souvent la même chose sur pas mal de plateformes.Envoyé par Premium
Pas facile. Il faut s'armer de documents rigoureux comme la norme (version de travail ici : http://www.open-std.org/jtc1/sc22/wg...docs/n1124.pdf ) et regarder les §6.3.1.1 §6.3.1.3 et §6.3.1.8. Dans le K&R c'est en annexe A la partie A6 qu'il faut lire attentivement. Penser aussi à regarder la doc. de l'opérateur binaire + et de l'opérateur d'affectation.Envoyé par Premium
Donc ici ca dépend, si un long int est capable de représenter toutes les valeurs d'un unsigned int dans ton implémentation, alors l'autre opérande sera converti en long et le type de l'expression (li+ui) sera long. Sinon, les 2 opérandes sont convertis en unsigned long et le type de l'expression (li+ui) sera unsigned long.
Comme souvent, maintenant, long int et int sont sur 32 bits, il y a de fortes chances que ce soit le second cas (expression unsigned long).
A+
Pour faire une opération binaire entre deux opérandes de types différents, les opérandes sont converties en un type commun, l'opération peut alors avoir lieu et le résultat est de ce type commun.
Si les deux opérandes sont un type entier
- les entiers de taille inférieure à un int sont convertis en int.
- le type commun est "le plus grand" des deux types entiers concernés ( int , long,...)
- si une des opérandes est unsigned, le type commun est un type entier unsigned
Hello,
D'accord.Envoyé par diogene
Pas d'accord, si un des opérandes (que j'appelle A) est d'un type signé de rang supérieur à celui non signé (que j'appelle B), et que le type de A est capable de représenter toutes valeurs de B, alors B est converti dans le type de A.Envoyé par diogene
A+
Foobar1329
Je ne crois pascitation:
Pas d'accord, si un des opérandes (que j'appelle A) est d'un type signé de rang supérieur à celui non signé (que j'appelle B), et que le type de A est capable de représenter toutes valeurs de B, alors B est converti dans le type de A.diogene a écrit :
- si une des opérandes est unsigned, le type commun est un type entier unsigned
Dans le livre
Methodologe de la programmation en C d'Achille Braquelaire, il parle de ces conversions de types. Très bon livre à consulter
Hello,
Ce n'est pas moi qui le dit :Envoyé par diogene
N1124 §6.3.1.8 :
A+Otherwise, if the type of the operand with signed integer type can represent all of the values of the type of the operand with unsigned integer type, then the operand with unsigned integer type is converted to the type of the operand with signed integer type.
Partager