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