Sábado 14 de Diciembre de 2024, 17:55
SoloCodigo
Bienvenido(a),
Visitante
. Por favor,
ingresa
o
regístrate
.
¿Perdiste tu
email de activación?
Inicio
Foros
Chat
Ayuda
Buscar
Ingresar
Registrarse
SoloCodigo
»
Foros
»
Programación General
»
C/C++
(Moderador:
Eternal Idol
) »
Operador Complemento A Uno
« anterior
próximo »
Imprimir
Páginas: [
1
]
Autor
Tema: Operador Complemento A Uno (Leído 1311 veces)
jmalloc
Nuevo Miembro
Mensajes: 3
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
#include <stdio.h>
#include <stdlib.h>
int main()
{
printf("Complemento a uno de 0: %d", ~0 ); /* Resustado obtenido: -1 */
putchar('\n');
printf("Complemento a uno de 1: %d", ~1 ); /* Resustado obtenido: -2 */
putchar('\n');
printf("Complemento a uno de 2: %d", ~2 ); /* Resustado obtenido: -3 */
putchar('\n');
printf("Complemento a uno de 152: %d", ~152 ); /* Resustado obtenido: -153 */
putchar('\n');
system("PAUSE");
return 0;
}
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
...
#include <math.h>
...
printf("Complemento a uno de 152: %d", abs(~152)); /* Resustado obtenido: 153 */
...
Saludos.
Tweet
hano
Miembro activo
Mensajes: 87
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:
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
printf("Complemento a uno de 0: %d, %u, %x", ~0, ~0, ~0 );
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
NOTA:
==================================================================
Este foro es para ayudar, aprender, compartir... usenlo para eso,
NO SE RESUELVEN DUDAS POR MENSAJE PRIVADO Y MENOS POR CORREO
==================================================================
Imprimir
Páginas: [
1
]
« anterior
próximo »
SoloCodigo
»
Foros
»
Programación General
»
C/C++
(Moderador:
Eternal Idol
) »
Operador Complemento A Uno