2010-02-05 10 views
6

Was ist Daten (Nummer), wenn die erforderliche Ausgabe von der folgenden Aussage ist: ERSTAUNLICH?c Puzzle (if-Anweisung)

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

Hausaufgaben durch Zufall ? – Paolo

+0

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

+0

@aaronls - Nifty Link, aber was hat es mit der Frage zu tun? –

Antwort

12

Es müßte der minimale Wert eine ganze Zahl sein, d.h. 0x80000000 wenn es 32-Bits ist, denn das ist die einzige Zahl ungleich Null ist, die gleich bleibt, wenn negiert.

#include <stdio.h> 

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

Ergebnis:

AMAZING 

Wie Richard Pennington zu Recht darauf hingewiesen, funktioniert dies wegen der two's complement Darstellung negativer Zahlen. Die größte darstellbare positive Zahl ist um einen Wert kleiner als die größte negative Zahl. Wenn Sie also versuchen, die größte negative Zahl zu negieren, wird ein int überströmt und die gleiche Zahl zurückgegeben.

Für Computer, die one's complement verwenden, kann der negative Wert jeder darstellbaren Zahl auch ohne Überlauf dargestellt werden, so dass dieses Puzzle keine Lösung hat.

+5

Ich versuchte dies auf meinem UNIVAC 1100 nach der Anpassung für 36 Bit Ganzzahlen (0x800000000) und es hat nicht funktioniert! –

+0

@Richard, laut Wikipedia für UNIVAC: Zahlen waren binär mit negativen Werten in der eigenen Ergänzung. http://en.wikipedia.org/wiki/UNIVAC_1101 Das wird also nicht funktionieren! Es funktioniert nur in Zweierkomplement. –

+0

@Mark: Ich weiß. Trick Kommentar. ;-) –

7

Es hängt von der Größe einer Ganzzahl ab und wie Ganzzahlen implementiert werden, aber auf einem Zweierkomplement-Computer mit 2 Byte Ganzzahlen lautet die Antwort -32768.

+0

Nun, es ist, wenn du gehe davon aus, dass CHAR_BIT 8 ist. –

0

Ich weiß nicht, was die Größe von Int in meiner Maschine. so habe ich ein Programm, um den Maximalwert von int zu finden wie

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

ich den maximalen Wert von i gefunden = -2147483648

assign dieses Datum dies funktionieren wird ..

+0

Sie drucken die Adresse ('& i') anstelle des Wertes (' i'). – finnw

+0

Ich teste dies auf Borland C++ 5.5.1 für Windows 32 auf Windows XP Maschine – chinnagaja

+0

Ja ... jetzt verstehe ich meinen Fehler, tut mir wirklich leid für die Veröffentlichung dieser, total einen großen Fehler von meinem Ende :( – chinnagaja