Conversion implicite C ++ (Signé + Non signé)
Je comprends qu'en ce qui concerne les conversions implicites, si nous avons un unsigned opérande de type et un type signé opérande, et le type non signé opérande est la même chose que (ou plus) que le type de la signature de l'opérande, la signature de l'opérande sera converti en non signé.
Donc:
unsigned int u = 10;
signed int s = -8;
std::cout << s + u << std::endl;
//prints 2 because it will convert `s` to `unsigned int`, now `s` has the value
//4294967288, then it will add `u` to it, which is an out-of-range value, so,
//in my machine, `4294967298 % 4294967296 = 2`
Ce que je ne comprends pas, j'ai lu que si la signature de l'opérande a un plus grand type de la unsigned opérande:
- si toutes les valeurs du type non signé fit dans le plus grand type, alors unsigned opérande est converti en type signé
- si les valeurs dans le type non signé ne rentrent pas dans le plus grand type, puis la signature de l'opérande sera converti en unsigned type
donc, dans le code suivant:
signed long long s = -8;
unsigned int u = 10;
std::cout << s + u << std::endl;
u
seront convertis signé long parce que les valeurs int peut s'adapter à la longue signée de temps??
Si c'est le cas, dans ce scénario, le plus petit type de valeurs ne rentre pas dans le plus grand?
source d'informationauteur 2013Asker
Vous devez vous connecter pour publier un commentaire.
Pertinents citation du Standard:
5 Expressions [expr]
[2 clauses sur l'égalité des types ou des types de signe égal omis]
Considérons la suite 3 exemple de cas pour chacune des 3 paragraphes ci-dessus sur un système où
sizeof(int) < sizeof(long) == sizeof(long long)
(facilement adaptable à d'autres cas)Live exemple de sortie.
Premier alinéa de l': types de rang égal, de sorte que le
signed int
opérande est converti enunsigned int
. Cela implique une valeur de transformation, qui (en utilisant en complément à deux) donne te imprimés de valeur.Deuxième alinéa: type signé a de plus haut rang, et (sur cette plate-forme!) peut représenter toutes les valeurs de type non signé, donc non signé opérande est converti en type signé, et vous obtenez -2
Troisième alinéa: type signé de nouveau a de plus haut rang, mais (sur cette plate-forme!) ne peut pas représenter toutes les valeurs de type non signé, de sorte que les deux opérandes sont convertis à
unsigned long long
et d'après la valeur de la transformation sur la signature de l'opérande, vous obtenez les imprimés de valeur.Noter que lorsque le non signé opérande serait assez grand (par exemple 6 dans ces exemples), alors que le résultat final serait de donner 2 pour tous les 3 exemples, parce que de unsigned integer overflow.
(Ajouté) Note que vous obtenez encore plus de résultats inattendus lorsque vous faites des comparaisons sur ces types. Considérons l'exemple ci-dessus 1 avec
<
:Depuis
2u
est faiteunsigned
explicitement par leu
suffixe les mêmes règles s'appliquent. Et le résultat n'est probablement pas ce que vous attendez lorsque l'on compare les -4 < 2 lors de l'écriture en C++-4 < 2u
...signed int
ne rentre pas dansunsigned long long
. Ainsi, vous aurez cette conversion:signed int
->unsigned long long
.Noter que le C++11 standard ne parle pas de la plus grande ou plus petite des types ici, il parle avec des types plus bas ou plus haut rang.
De considérer le cas de
long int
etunsigned int
où les deux sont en 32 bits. Lelong int
a une plus grande place que launsigned int
mais depuislong int
etunsigned int
sont à la fois 32 bits,long int
ne peut pas représenter toutes les valeurs deunsigned int
.Par conséquent, nous tombons dans le dernier cas (C++11: 5.6p9):
Cela signifie que les
long int
et launsigned int
seront convertis enunsigned long int
.