2017-03-08 2 views
0

code:C++ Arithmétique type de conversion avec des entiers non signés et signés

#include<iostream> 
using std::cout; using std::endl; 

int main() 
{ 
    unsigned int i = 5; 
    int x = -3; 

    cout << "(i + x) = " << (i + x) << endl; 

    cout << "Set x to -6" << endl; 
    x = -6; 

    cout << "(i + x) = " << (i + x) << endl; 
} 

Sortie:

(i + x) = 2 
Set x to -6 
(i + x) = 4294967295 

Dans cet exemple, le type du résultat retourné par (i + x) est un entier non signé, cependant, je pensais qu'avec les conversions de type arithmétique, l'entier signé (la variable "x" dans ce cas) est supposé être "promu" en un entier non signé avant que les opérations aient lieu. Cela ne doit pas être le cas puisque le premier résultat de (i + x) serait (5 + (2^31 - 1 - 3)) = 4294967297 et non 2. Y a-t-il quelque chose qui me manque ici? Il me semble que seul le résultat final est converti en un entier non signé, et non les opérandes initiaux.

+0

Numéros non signés [wrap modulo] (http://stackoverflow.com/a/22801135/1708801) –

Répondre

4

Votre erreur est en supposant que le calcul est (5 + (2^31 - 1 - 3)). L'interprétation unsigned de -3 est basée sur une valeur maximale de 2^32 - 1 (UINT_MAX), et non de 2^31 - 1 (INT_MAX). Donc, vous prenez 2^32 - 1 - 3 (UINT_MAX - 3), en ajoutant 5, et puisque cela dépasse UINT_MAX, il revient tout de suite autour de 2, au moins sur votre système de complément à deux avec 32 bits int s.