Güenas,
En realidad este es un tema que viene de
http://www.forosdelweb.com/f60/como-...inario-523683/
Pero como ya se desvió mucho del tópico original he decidido separarlo en un nuevo hilo.
Me he quedado atrapado en esto de las diversas formas que tienen los distintos programas de mostrar un cambio de base cuando el número es negativo...
Justamente el propósito de este post es mostrar los distintos comportamientos.
NOTA: En algunos programa no encontré forma automática (no sirve que yo haga una pequeña función) de pasar un número a binario, por lo que pasé a hexadesimal, ya que en teoría, el procedimiento sería el mismo con la única diferencia de la base. Si alguno de Uds. conoce una forma automática, por favor completar la lista.
RESUMAMOS LOS COMPORTAMIENTOS:
(Por supuesto que desconozco el funcionamiento interno... Tan sólo me limito a juzgar los resultados)
[1] Convierte el valor absoluto del número a binario y luego NIEGA la PALABRA.
[2] Convierte el valor absoluto del número a binario e IGNORA el signo.
[3] Provoca error.
[4] Convierte el valor absoluto del número a binario y luego le agrega el signo.
Siéntanse libres de ampliar la lista...
[CALCULADORAS FISICAS] *Casio fx-570MS
-1
RTA: 11111111111111
COMPORTAMIENTO: [1]
[CALCULADORAS POR SOFTWARE] *Calculadora de Windows
-1 (en sistema binario)
RTA: 11111111111111
COMPORTAMIENTO: [1]
*kcalc (calculadora de KDE)
-1 (en sistema binario)
RTA: 1
COMPORTAMIENTO: [2]
[PLANILLAS DE CÁLCULO] *OpenOffice.org Calc (forma 1)
=BASE(-1;2)
RTA: Err:502
COMPORTAMIENTO: [3]
*OpenOffice.org Calc (forma 2)
=DEC2BIN(-1)
RTA: 1111111111111
COMPORTAMIENTO: [1]
*Excel
=DEC2BIN(-1)
RTA: 1111111111111
COMPORTAMIENTO: [1]
[COMPILADORES C/C++/C#] *gcc (C)
itoa(decimal,binario,2);
RTA: 11111111111111
COMPORTAMIENTO: [1]
*g++ (C++)
(NOTA: No entontré forma automática de transformar en binario, de modo que lo pasé a hexadesimal)
cout << hex << -1 << endl;
RTA: FFFFFFFFFFF
COMPORTAMIENTO: [1]
*.Net (C#)
(NOTA: No entontré forma automática de transformar en binario, de modo que lo pasé a hexadesimal)
int i=-1;
Console.WriteLine("{0}", i.ToString("X"));
Console.WriteLine(String.Format("{0:X}",i));
RTA: FFFFFFFFFFF
COMPORTAMIENTO: [1]
*Mono (C#)
(NOTA: No entontré forma automática de transformar en binario, de modo que lo pasé a hexadesimal)
int i=-1;
Console.WriteLine("{0}", i.ToString("X"));
Console.WriteLine(String.Format("{0:X}",i));
RTA: FFFFFFFFFFF
COMPORTAMIENTO: [1]
[PROGRAMAS DE MATEMÁTICAS]
*MathCad
(NOTA: En el MathCad que tengo yo (MathCad 7, un tanto viejito) no encontré forma automática de transformar en binario, de modo que lo pasé a hexadesimal)
a:=-1
a=-1h
COMPORTAMIENTO: [4]
*Octave (forma 1)
octave:1> dec2bin(-1)
error: dec2base: can only convert non-negative integers
COMPORTAMIENTO: [3]
*Ocatave (forma 2)
(NOTA: No transformación vía hexadesimal)
octave:2> printf("Nro: %x\n", -1)
Nro: -1
COMPORTAMIENTO: [4]
CONCLUSIÓN:
Respecto a la opción ampliamente más usada [1], veo en wikipedia:
http://en.wikipedia.org/wiki/Binary_numeral_system
En la parte de Subtraction dice:
A - B = A + not B + 1
Tomemos que:
A = 0
B = -Nro (Nro es el número que nosotros queremos escribir como negativo)
Reemplazando queda:
A - B = A + not B + 1
0 - (-Nro) = 0 + not (-Nro) + 1
Nro = not -Nro + 1
Si Nro = -1
-1 = not 1 + 1
Tomemos 4 posiciones, de modo que:
1 = 0001
-1 = 1110
Reemplazando:
-1 = not 1 + 1
-1 = 1110 + 1
-1 = 1111
Saludos