2010-02-05 6 views
6

Qu'est-ce que data (number), si la sortie requise de l'instruction suivante est: AMAZING?c puzzle (if statement)

main() 
{ 
int data; 
if(data!=0 && data==-data) 
{ 
    printf("AMAZING"); 
} 
} 
+2

devoirs par hasard ? – Paolo

+0

Voir http://en.wikipedia.org/wiki/Quantum_suicide_and_immortality – AaronLS

+0

@aaronls - Lien astucieux, mais qu'est-ce que cela a à voir avec la question? –

Répondre

12

Il faudrait être la valeur minimale d'un nombre entier, à savoir 0x80000000 si elle est 32 bits, parce que c'est le seul numéro autre que zéro qui reste le même lorsque réduit à néant.

#include <stdio.h> 

main() 
{ 
int data = 0x80000000; 
if(data!=0 && data==-data) 
{ 
    printf("AMAZING"); 
} 
} 

Résultat:

AMAZING 

Comme Richard Pennington a à juste titre, cela fonctionne à cause de la représentation two's complement des nombres négatifs. Le plus grand nombre positif représentable est un plus petit en valeur absolue que le plus grand nombre négatif, donc si vous essayez de nier le plus grand nombre négatif, il déborde un int et s'enroule, en redonnant le même nombre.

Pour les ordinateurs qui utilisent one's complement, la valeur négative de chaque nombre représentable peut également être représentée sans débordement, de sorte que ce puzzle n'a pas de solution.

+5

J'ai essayé cela sur mon UNIVAC 1100 après ajustement pour les entiers 36 bits (0x800000000) et cela n'a pas fonctionné! –

+0

@Richard, selon Wikipedia pour UNIVAC: Les nombres étaient binaires avec des valeurs négatives dans le complément. http://en.wikipedia.org/wiki/UNIVAC_1101 Donc ça ne marchera pas! Cela ne fonctionne que dans le complément à deux. –

+0

@Mark: Je sais. Commentaire de truc. ;-) –

7

Cela dépend de la taille d'un entier et de la façon dont les entiers sont implémentés, mais sur une machine à complément à deux avec des entiers de 2 octets, la réponse est -32768.

+0

Eh bien, c'est si vous Je vais faire le tour en supposant que CHAR_BIT est 8. –

0

Je ne sais pas quelle est la taille de int dans ma machine. donc j'utilisé un programme pour trouver la valeur maximum de int comme

void main() 
{ 
    int i; 
    do{ 
     }while(i>i++); 
    printf ("data=%d",i); 
} 

J'ai trouvé la valeur maximale de i = -2147483648

assigner à des données ceci étant ..

+0

Vous imprimez l'adresse ('& i') au lieu de la valeur (' i'). – finnw

+0

je teste ceci sur Borland C++ 5.5.1 pour Windows 32 sur Windows XP machine – chinnagaja

+0

Oui ... maintenant je comprends mon erreur, je suis vraiment désolé de poster ceci, totalement une grosse erreur de ma part :( – chinnagaja