2010-02-05 7 views
6

데이터 (번호)는 다음 문장의 필수 결과입니다 : AMAZING?c 퍼즐 (if 문)

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

숙제를 찾기 위해 프로그램을 사용하여 ? – Paolo

+0

http://en.wikipedia.org/wiki/Quantum_suicide_and_immortality을 참조하십시오. – AaronLS

+0

@aaronls - 멋지게 연결되었지만 질문과 무슨 상관이 있습니까? –

답변

12

그것은 그 부인되면 동일하다 0 이외의 유일한 번호이기 때문에, 정수, 즉 0x80000000에가 32 비트 인 경우의 최소값 될 거라고.

#include <stdio.h> 

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

결과 : 리차드 페닝 턴이 제대로 지적

AMAZING 

,이 때문에 음수의 two's complement 표현의 작동합니다. 표현할 수있는 가장 큰 양수는 가장 큰 음수보다 절대 값이 작은 숫자입니다. 따라서 가장 큰 음수를 무효화하려고 시도하면 int가 오버플로되어 같은 숫자가 반환됩니다.

one's complement을 사용하는 컴퓨터의 경우 모든 표현 가능한 숫자의 음수 값도 오버플로없이 표현할 수 있으므로이 퍼즐에는 해결 방법이 없습니다.

+5

36 비트 정수 (0x800000000)를 조정 한 후 UNIVAC 1100에서이 작업을 시도했지만 작동하지 않았습니다! –

+0

@ 리차드 (Wikipedia for UNIVAC) : 숫자는 1의 보수로 음수 값을 갖는 바이너리였습니다. http://en.wikipedia.org/wiki/UNIVAC_1101 이렇게하면 작동하지 않습니다! 그것은 2의 보수로만 작동합니다. –

+0

@ 마크 : 알아. 트릭 코멘트. ;-) –

7

정수의 크기와 정수의 구현 방법에 따라 다르지만 2의 정수가있는 2의 보수 시스템에서는 대답이 -32768입니다.

+0

CHAR_BIT가 8이라고 가정하고 돌아가겠습니다. –

0

내 컴퓨터에서 정수의 크기를 알 수 없습니다. 그래서 혹시 최대 난의 최대 값을 발견

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

같은 INT의 값 =이 작동 데이터 -2147483648

할당이 ..

+0

값 ('i') 대신 주소 ('& i')를 인쇄하고 있습니다. – finnw

+0

윈도우 XP에서 윈도우 32 용 Borland C++ 5.5.1을 테스트 중입니다 – chinnagaja

+0

예 ... 이제 실수로 이해합니다. 정말 끝내 주시면 큰 실수가됩니다. ( – chinnagaja