• Viernes 19 de Abril de 2024, 12:23

Autor Tema:  Operador Complemento A Uno  (Leído 1232 veces)

jmalloc

  • Nuevo Miembro
  • *
  • Mensajes: 3
    • Ver Perfil
Operador Complemento A Uno
« en: Lunes 27 de Agosto de 2007, 17:31 »
0
Hola,
Esoy probando el operador de bits complemento a uno (negación). Pero en la salida no obtengo los resultados esperados. Y eso me ocurre con los tres IDES con que probé el mismo código (Code::Blocks, Dev-C++, VC++ 6).

Código:

Código: Text
  1.  
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4.  
  5. int main()
  6. {
  7.     printf("Complemento a uno de 0: %d", ~0 );  /* Resustado obtenido: -1 */
  8.     putchar('\n');
  9.     printf("Complemento a uno de 1: %d", ~1 );  /* Resustado obtenido: -2 */
  10.     putchar('\n');
  11.     printf("Complemento a uno de 2: %d", ~2 );  /* Resustado obtenido: -3 */
  12.     putchar('\n');
  13.     printf("Complemento a uno de 152: %d", ~152 ); /* Resustado obtenido: -153 */
  14.     putchar('\n');
  15.     system("PAUSE");
  16.     return 0;
  17. }
  18.  
  19.  
  20.  

En teoría:
La primer salida me debería dar: 1 , porque 0 en binario es 0 y su complemento es 1
La segunda: 0 porque 1 en binario es 1 y su complemento es 0
La tercera: 1 porque 2 en binario es 10 y su complemento es 01
La cuarta, me debería dar 103

Probé de todo, incluso agregándole el valor absoluto -por las dudas- así:

Código: Text
  1.  
  2. ...
  3. #include <math.h>
  4. ...
  5. printf("Complemento a uno de 152: %d", abs(~152)); /* Resustado obtenido: 153 */
  6. ...
  7.  
  8.  

Saludos. :(

hano

  • Miembro activo
  • **
  • Mensajes: 87
    • Ver Perfil
Re: Operador Complemento A Uno
« Respuesta #1 en: Lunes 27 de Agosto de 2007, 19:08 »
0
Complemento a 1 de 0 (para int32):

0000000... (32 ceros) --> 1111111.... (32 unos) = -1 (en complemento a 2)

El operador se aplica a todos los bits en memoria, ejemplo, para int8:

2 (00000010) --> (comp. 1) --> -3 (11111101)

Revisa la teoría básica.

Un saludo.

Luis Javier López Arredondo
                                                                                               
Para programadores
http]
[url=https://hardprogrammer.blogspot.com]https]

ProfesorX

  • Moderador
  • ******
  • Mensajes: 796
  • Nacionalidad: mx
    • Ver Perfil
Re: Operador Complemento A Uno
« Respuesta #2 en: Lunes 27 de Agosto de 2007, 19:32 »
0
El problema esta en tu falta de la comprension de como se manejan internamente los numeros en la computadora, y depende tambien de si manejas valores de un byte o de dos bytes, y de si manejas signo o no.

Si manejas valores de un byte sin signo, el rango de valores va de 0 a 255, y si manejas valores con signo, el rango va de -127 a 128, pues un bit del byte se utiliza para el signo. entonces, si tomara tu primer ejemplo, lo transformara a un numero de 8 bits, obtendria esto:

Cero: 00000000
Complemento: 11111111

Podras ver que el numero 11111111, representaria el 255, o el -1, dependiendo de si decides que el numero lleva signo o no. puedes comprobarlo, utilizando la siguiente sentencia:

Código: Text
  1.  
  2. printf("Complemento a uno de 0: %d, %u, %x", ~0, ~0, ~0 );
  3.  
  4.  

que te imprimira el numero como un entero con signo, un entero sin signo, y en formato hexadecimal respectivamente.

para mas informacion:

http://www.zator.com/Cpp/E4_9_3.htm
http://es.wikipedia.org/wiki/Representaci%...meros_con_signo

Saludos  :hola:

NOTA:
==================================================================
Este foro es para ayudar, aprender, compartir... usenlo para eso,
NO SE RESUELVEN DUDAS POR MENSAJE PRIVADO Y MENOS POR CORREO
==================================================================