2010-02-05 34 views
6

Aşağıdaki ifadeden istenen çıktı ise veri (sayı) nedir: AMAZING?c puzzle (if deyim)

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

ödev bulmak için bir program kullanılır ? – Paolo

+0

Bkz. Http://en.wikipedia.org/wiki/Quantum_suicide_and_immortality – AaronLS

+0

@aaronls - Nifty bağlantı, ancak sorunun ne ile ilgisi var? –

cevap

12

O etkisiz zaman aynı kalır sıfırdan farklı tek sayı olduğu, bir tam sayı, yani 0x80000000 32-bit ise minimum değer gerekir.

#include <stdio.h> 

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

Sonuç: Richard Pennington doğru belirttiği gibi

AMAZING 

, bunun nedeni olumsuz sayıların two's complement temsilinin çalışır. En büyük temsil edilebilir pozitif sayı, en büyük negatif sayıdan mutlak değerde bir küçüktür, bu yüzden en büyük negatif sayıyı reddetmeye çalışırsanız, bir int taşar ve etrafı sarar ve aynı sayıyı geri getirir.

one's complement kullanan bilgisayarlar için, her bir temsilci sayısının negatif değeri taşma olmadan da gösterilebilir; bu nedenle bu bulmacanın bir çözümü yoktur.

+5

Bunu 36 bit tam sayı için (0x800000000) ayarladıktan sonra UNIVAC 1100 üzerinde denedim ve çalışmadı! UNIVAC için Wikipedia'ya göre –

+0

@Richard: Rakamlar, tamamlayıcıda negatif değerler içeren ikiliydi. http://en.wikipedia.org/wiki/UNIVAC_1101 Bu işe yaramayacak! Sadece iki tamamlayıcıda çalışır. –

+0

@Mark: Biliyorum. Trick yorumu. ;-) –

7

Tamsayı büyüklüğüne ve tamsayıların nasıl uygulandığına, ancak 2'nin iki baytlı tamsayı makinesinde, yanıtın -32768 olduğuna bağlıdır.

+0

Şöyle bir röportaja cevap olarak iltifat ettiğimde benden daha fazla şansınız olduğunu görüyorum. CHAR_BIT'in 8 olduğunu farz edelim. –

0

Makinemde int boyutunun ne olduğunu bilmiyorum. bu yüzden bir ihtimal maksimum Ben i maksimum değer bulundu

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

gibi int değerini = Bu çalışacak verilere -2147483648

ata bu ..

+0

Adres ('i') yerine (' & i') adresini yazdırıyorsunuz. – finnw

+0

Ben Windows XP makinede 32 windows için Windows XP makinesinde – chinnagaja

+0

Yea ... test ediyorum Şimdi hatamı anlıyorum, gerçekten bu yüzden, benim için çok büyük bir hata gönderme için üzgünüm :( – chinnagaja