2016-12-29 4 views
0

J'ai fait un débordement signé plusieurs fois mais chaque fois je fais un enveloppement turbo. Par exemple:Pourquoi le turbo c wraparound a-t-il un débordement d'entier signé à chaque fois que le dépassement d'entier signé est indéfini?

#include <stdio.h> 

void main() { 
    int i = 100000; 
    printf("%d", i); 
    getch(); 
} 

La sortie est -31072 qui est le résultat attendu si wraparound est fait. En binaire 100000(dec) est 11000011010100000 et les 16 derniers bits sont magasin dont est 1000011010100000. Dans deux représentation de complément 1000011010100000 est -31072.

+0

Regardez [this] (https://www.youtube.com/watch?v=yG1OZ69H_-o). Il fait un bon travail d'explication de comportement indéfini plus et parle spécifiquement de comportement indéfini et la façon dont nous utilisons parfois hyperbole pour le décrire. – wally

Répondre

2

Votre exemple ne contient aucun dépassement signé, il n'y a donc pas de comportement indéfini.

(En supposant que INT_MAX est inférieur à 100000)

L'affectation:

int i=100000; 

effectue une conversion implicite à partir d'un type long, qui est le type de la constante de nombre entier 100000, de type int. Ce résultat de conversion est défini par l'implémentation (ou un déroutement défini par l'implémentation est un signal).


(cité à partir de: ISO/IEC 9899: 201x 6.3.1.3 signé et entiers non signés 3)
Sinon, le nouveau type est signé et la valeur ne peut pas être représenté en elle; le résultat est défini par l'implémentation ou un signal défini par l'implémentation est déclenché.