Académique Documents
Professionnel Documents
Culture Documents
+
1
0
1
1
0
, 0 16 16
m
k
j j
k
k m
n
j
j
j
F b a b a X
Analogamente para la base hexadecimal se tiene:
+
1
0
1
1
0
9 , 0 10 10
m
k
j j
k
k m
n
j
j
j
b a b a X
Luego la base 10 puede representarse como:
2/1/12 Mg. Edgar Ruiz Lizama 77
Para la base octal:
+
1
0
1
1
0
7 , 0 8 8
m
k
j j
k
k m
n
j
j
j
b a b a X
Generalizando para cualquier base r:
< +
1
0
1
1
0
, 0
m
k
j j
k
k m
n
j
j
j
r b a r b r a X
2/1/12 Mg. Edgar Ruiz Lizama 88
El siguiente programa en C++ computa la representacin de algunos
nmeros en base decimal, octal y hexadecimal para datos de tipo entero.
#include <iostream>
#include <conio.h>
int x[]={256,1,-1,350,-45,1024,850};
using namespace std;
int main() // bases.cpp
{
int i;
for(i=0;i<sizeof(x)/sizeof(int);i++)
{ cout<<endl<<"En decimal " <<dec<<x[i];
cout<<endl<<"En hexadecimal "<<hex<<x[i];
cout<<endl<<"En octal " <<oct<<x[i]<<endl;
}
getche();
return 0;
}
2/1/12 Mg. Edgar Ruiz Lizama 99
NOTACION SIN SIGNO
La notacin sin signo es usada para representar enteros no negativos. Esta
notacin no soporta enteros negativos ni nmeros de punto flotante. Un nmero
n-bit, A, en notacin sin signo es representado como:
{ }
1
0
1 , 0 2
n
k
k
k
k
a donde a A
0 1 2 1
a a a a A
n n
1
]
1
k
n
k
k
k
a
a donde a A
n
0 1 2 1
a a a a A
n n
k
n
n
n
k
k
k
a a a A
0 1 2 1
a a a a A
n n
+
1
]
1
n
n
n
k
k
k
a a A
2/1/12 Mg. Edgar Ruiz Lizama 1919
El cual puede ser escrito como:
Donde x est definido como el complemento unario.
Resumiendo se tiene:
( )
1
1
2
0
2 2 1
1
]
1
+
n
n
n
k
k
k
a a A
'
1 , 0
0 , 1
x si
x si
x
A A + 1
Cuando un nmero A es positivo o negativo el complemento a dos de A es
equivalente a -A
00000001 = +1
11111110 ~1 (complemento a uno)
+1
11111111 = -1 (complemento a dos)
2/1/12 Mg. Edgar Ruiz Lizama 2020
Dicho rango no es simtrico porque el nmero cero est representado.
char (8 bit)
short (16 bit)
int (16, 32 o 64 bit)
long (32 bit)
Nota: El nmero de bits para cada tipo depende del compilador.
En el lenguaje de programacin C++ los tipos de datos que utilizan
notacin con complemento a dos son:
1 2 2
1 1
n n
A
El rango de nmeros en n-bit con notacin de complemento a dos est dado por
El siguiente programa bits2.cpp ilustra el uso de operadores a nivel de bits:
2/1/12 Mg. Edgar Ruiz Lizama 2121
/* usa los operadores de bits: AND, OR
inclusivo, OR exclusivo y el operador
complemento a uno */
#include <iostream>
void mostrarBits(unsigned int);
using namespace std;
int main() // bits2.cp Edgar Ruiz L.
{
unsigned num1, num2, mask;
num1 = 32767;
mask = 1;
cout<<"\nEl resultado de combinar lo
siguiente:\n";
mostrarBits(num1);
mostrarBits(mask);
cout<<"usando el operador a nivel de bits
AND & es\n";
mostrarBits(num1 & mask);
cout<<"\nEl resultado de combinar lo
siguiente:\n";
mostrarBits(num1);
mostrarBits(mask);
cout<<"usando el operador a nivel de bits
OR | inclusivo es\n";
mostrarBits(num1 | mask);
num1 = 100;
num2 = 1000;
cout<<"\nEl resultado de combinar lo
siguiente:\n";
mostrarBits(num1);
mostrarBits(num2);
2/1/12 Mg. Edgar Ruiz Lizama 2222
cout<<"usando el operador a nivel de
bits OR ^ exclusivo es\n";
mostrarBits(num1 ^ num2);
num1 = 65535;
cout<<"\nEl complemento a uno de:\n";
mostrarBits(num1);
cout<<"es\n";
mostrarBits(~num1);
return 0;
}
void mostrarBits(unsigned valor)
{
unsigned i, displayMask = 1 << 15;
cout<<valor<<" = ";
for (i = 1; i <= 16; i++)
{ cout<<(valor&displayMask?'1':'0');
valor <<= 1;
if (i % 8 == 0)
cout<<' ';
}
cout<<"\n";
}
La salida para el programa bits2.cpp se presenta a continuacin
2/1/12 Mg. Edgar Ruiz Lizama 2323
2/1/12 Mg. Edgar Ruiz Lizama 2424
REPRESENTACION EN
PUNTO FLOTANTE
Los nmeros en punto flotante en las computadoras binarias, se representan en
notacin cientfica o exponencial. Un nmero en punto flotante positivo o negativo
tiene un signo en valor fraccionario o mantisa y un exponente tal como sigue:
e
b M S N
Donde:
N es un nmero fraccionario.
S es positivo o negativo.
M es la mantisa 0 < M > 1
b es la base entera positiva >= 2
e es el exponente entero con signo.
Tambin se tiene que M = 0.d1d2dk, donde M es normalizada si d1 <> 0, di es
entero y 0 <di1<b.
2/1/12 Mg. Edgar Ruiz Lizama 2525
ESTANDAR IEEE PARA32 BITS
En los lenguajes de alto nivel la representacin en punto flotante se utiliza para
clculos que involucren nmeros reales positivos o negativos. El estndar IEEE 754
para punto flotante en bits es el ms ampliamente usado. Este estndar especifica
que un nmero en punto flotante se puede representar en 32 bits, 64 bits y en 80
bits.
Este estndar es usado por C y C++ para los reales de precisin simple como son
los de tipo float. Este formato consiste en 23 bits para la fraccin o mantisa M, 8
bits para el exponente y el exceso (cuyo uso permite considerar positivos y
negativos) y 1 bit para el signo; siendo 1 positivo 0 negativo. Los resultados se
normalizan despus de cada operacin. Esto significa que la mayora de los bits
significativos de la fraccin se fuerzan para ser uno, ajustando el exponente, dado
que el bit debe ser uno, este no es almacenado como parte del nmero. A esto se
le llama bit implcito.
2/1/12 Mg. Edgar Ruiz Lizama 2626
Donde:
S = bit con signo (1 positivo y 0 negativo)
e = exponente
7Eh = exceso fijado a 128; su uso es permitir exponentes positivos y negativos
Siendo la base b = 2
NOTA: El numero 0.0 se representa con 32 bits 0
El siguiente programa muestflo.cpp permite visualizar cinco nmeros en punto
flotante a su respectiva representacin en hexadecimal.
2/1/12 Mg. Edgar Ruiz Lizama 2727
#include <stdio.h>
#include <conio.h>
#include <iostream>
using namespace std;
int main() // muestflo.cpp
{ float f;
char *p;
//prueba para 5 numeros
for ( int i=1; i<=5; i++)
{ printf("Numero? ");
scanf("%f",&f);
p=(char *)&f;
printf("%2x%2x%2x%2x\n",p[0],p[1],p[2],p[3]);
}
return 0;
}
2/1/12 Mg. Edgar Ruiz Lizama 2828
ESTANDAR IEEE PARA 64 BITS
Este estndar lo utiliza C y C++ para los reales de precisin doble como son los de
tipo double. Este formato consiste en 52 bits para la fraccin o mantisa M, 11 bits
para el exponente y el exceso mas 1 bit para el signo. Al igual que con los reales
de precisin simple, los resultados son normalizados despus de cada operacin.
Para el nmero 0.0, la norma indica que se representa con 64 bit 0.
El siguiente programa muestdob.cpp permite visualizar cinco nmeros en punto
de doble precisin en su representacin en bits.
2/1/12 Mg. Edgar Ruiz Lizama 2929
#include <iostream>
using namespace std;
union bits {
bits(double n);
void mostrar_bits();
double dob;
unsigned char c[sizeof(double)];
};
bits :: bits(double n)
{
dob = n;
}
2/1/12 Mg. Edgar Ruiz Lizama 3030
void bits :: mostrar_bits()
{
int j;
for (j = sizeof(double)-1; j>=0; j--)
{
for (int i = 128; i; i>>=1)
if (i & c[j])
cout<< "1";
else
cout<< "0";
// separando byte a byte desde byte 7 al byte 0
cout<<" ";
}
}
2/1/12 Mg. Edgar Ruiz Lizama 3131
int main() // muesdob1.cpp
{
double dob;
for (int i=0; i<3; i++)
{ cout<<"\ningrese numero double: ";
cin>>dob;
bits num(dob);
num.mostrar_bits();
}
cout<<endl;
return 0;
}
2/1/12 Mg. Edgar Ruiz Lizama 3232
REPRESENTACION DE
CARACTERES
Los caracteres (letras, dgitos, signos de puntuacin, etc.) son representados
en el sistema de caracteres ASCII , el cual es un conjunto que posee 256
cdigos (0,, 255), donde cada cdigo es 1 byte. Los primeros 128
cdigos ASCII son caracteres de control los cuales fueron de uso comn en
las primeras mquinas. Como puede verse, los caracteres ASCII son
ordinales y a cada carcter le corresponde un nmero.
El siguiente programa muestra los caracteres alfabticos tanto en
maysculas como en minsculas y su correspondiente valor ASCII.
2/1/12 Mg. Edgar Ruiz Lizama 3333
#include <iostream>
#include <ctype.h>
using namespace std;
int main() // carascii.cpp
{ char c;
cout<<"\nCaracteres alfabeticos en Mayusculas"<<endl;
for (c='A'; c<='Z'; c++)
cout<<c<<" = "<< toascii(c)<<"\t";
cout<<endl;
cout<<"\nCaracteres alfabeticos en Minusculas"<<endl;
for (c='a'; c<='z'; c++)
cout<<c<<" = "<< toascii(c)<<"\t";
cout<<endl<<endl;
return 0;
}
2/1/12 Mg. Edgar Ruiz Lizama 3434
La salida para carascii.cpp es:
2/1/12 Mg. Edgar Ruiz Lizama 3535
En cada base numrica se tiene dgitos significativos bm;
donde b es la base y m es el conjunto de dgitos vlidos en la
base b. Por ejemplo en base 2 se tiene que m = {0,1}; en
base 8(octal), m = {0,1,2,3,4,5,6,7}; en base 10 (decimal); se
tiene m = {0,1,2,3,4,5,6,7,8,9}; finalmente en base 16
(hexadecimal) se tiene m={0, 1,2,3,4,5,6,7,8,9,a,b,c,d,e,f}.
El siguiente programa esdighex.cpp averigua si un caracter
ingresado por el usuario es o no un dgito hexadecimal
2/1/12 Mg. Edgar Ruiz Lizama 3636
#include <iostream>
using namespace std;
int main() // esdighex.cpp
{
char c;
cout<<endl<<"Ingrese carcter: ";
cin>>c;
if((c>='0'&& c<='9')||(c>='a'&& c<='f')||(c>='A' && c<='Z'))
cout<<c<<" es digito hexadecimal";
else
cout<<c<<" no es digito hexadecimal";
return 0;
}
2/1/12 Mg. Edgar Ruiz Lizama 3737
La salida para cuatro corridas sucesivas de esdighex.cpp es:
Ingrese carcter: a
a es digito hexadecimal
Ingrese carcter: 4
4 es digito hexadecimal
Ingrese carcter: m
m no es digito hexadecimal
Ingrese carcter: f
f es digito hexadecimal
REFERENCIAS
Deitel H.M. y Deitel P.J., (1995). Como Programar en C/C++ ". Mxico, 2da. ed.
Prentice Hall: 927p.
Parker Alan, (1993). "Algorithms and Data Structures in C++ ". USA CRC Press:
257p.
Ruiz Lizama Edgar, (1999). "Curso de Lenguaje C". Lima, Facultad de Ingeniera
Industrial UNMSM: 234p.