2010-02-05 32 views
6

¿Cuál es la información (número), si el resultado requerido de la siguiente declaración es: INCREÍBLE?c puzzle (declaración if)

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

tarea por casualidad ? – Paolo

+0

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

+0

@aaronls - Enlace ingenioso, pero ¿qué tiene que ver con la pregunta? –

Respuesta

12

Tendría que ser el valor mínimo de un número entero, es decir, 0x80000000 si es de 32 bits, porque es el único número distinto de cero que sigue siendo la misma cuando negada.

#include <stdio.h> 

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

Resultado:

AMAZING 

Como Richard Pennington señaló correctamente, esto funciona debido a la two's complement representación de los números negativos. El número positivo representable más grande es uno más pequeño en valor absoluto que el número negativo más grande, por lo que si intenta negar el número negativo más grande, se desborda un int y se envuelve, devolviendo el mismo número.

Para computadoras que usan one's complement, el valor negativo de cada número representable también se puede representar sin desbordamiento, por lo que este rompecabezas no tiene solución.

+5

¡Probé esto en mi UNIVAC 1100 después de ajustar por enteros de 36 bits (0x800000000) y no funcionó! –

+0

@Richard, según Wikipedia para UNIVAC: los números eran binarios con valores negativos en el complemento. http://en.wikipedia.org/wiki/UNIVAC_1101 ¡Así que esto no funcionará! Solo funciona en complemento a dos. –

+0

@Mark: Lo sé. Trick comment. ;-) –

7

Depende del tamaño de un entero y cómo se implementan los enteros, pero en una máquina de dos complementos con enteros de 2 bytes, la respuesta es -32768.

+0

Bueno, es si usted Irá por ahí suponiendo que CHAR_BIT es 8. –

0

No sé cuál es el tamaño de int en mi máquina. por lo que utiliza un programa para encontrar el valor máximo de int como

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

encontré el valor máximo de i = -2147483648

ceder el presente a los datos de que esto funcionará ..

+0

Está imprimiendo la dirección ('& i') en lugar del valor (' i'). – finnw

+0

estoy probando esto en Borland C++ 5.5.1 para Windows 32 en Windows XP máquina – chinnagaja

+0

Sí ... ahora entiendo mi error, lo siento mucho por publicar esto, totalmente un gran error de mi parte :( – chinnagaja