Vous êtes sur la page 1sur 37

2/1/12 Mg.

Edgar Ruiz Lizama 11


C++
C++
REPRESENTACION
DE DATOS
REPRESENTACION DE
DATOS
2/1/12 Mg. Edgar Ruiz Lizama 22
C++
Presenta la forma como se representan los datos
en una computadora sustentados en conceptos de
matemtica discreta y prueba los mismos
utilizando los lenguajes de programacin C y C+
+.
RESUMEN
2/1/12 Mg. Edgar Ruiz Lizama 33
El tremendo crecimiento de las computadoras se debe
particularmente al hecho de que estos dispositivos fsicos son
cada vez ms baratos y se distinguen por que manipulan dos
estados a grandes velocidades. De hecho las computadoras son
dispositivos que manipulan dos estados (0,1); es decir binario y
tambin con representaciones en octal y hexadecimal los que son
utilizados para la representacin de datos. Al respecto ver la tabla
siguiente:
REPRESENTACION DE ENTEROS
Tabla I: Representacion de Datos
2/1/12 Mg. Edgar Ruiz Lizama 44
2/1/12 Mg. Edgar Ruiz Lizama 55
La representacin en cada base es anloga a la base 10. Por ejemplo, el nmero
841 en base 10 es calculado como:
0 1 2
10 1 10 4 10 8 841 + +
Y el nmero real 841.35 base 10 es calculado como:
2 1 0 1 2
10 5 10 3 10 1 10 4 10 8 35 . 841

+ + + +
En forma ms precisa, si un nmero X, se tiene n dgitos antes del punto
decimal y m dgitos despus del punto decimal, se tiene:
0 1 2 1 0 1 2 1
b b b b a a a a X
m m n n



2/1/12 Mg. Edgar Ruiz Lizama 66

+
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

Con un valor de:


Los nmeros negativos no son representables en formato sin signo. El
rango de los nmeros en n-bit sin signo es:
1 2 0
n
A
2/1/12 Mg. Edgar Ruiz Lizama 1010
- unsigned char 8 bits
- unsigned short 16 bits
- unsigned int (tamao nativo de la mquina)
- unsigned long (depende de la mquina)
NOTA: El nmero de bits para cada tipo puede ser dependiente del
compilador.
El 0 es el nico que est representado en notacin sin signo. C++ posee
los siguientes tipos de notacin sin signo en sus programas.
El siguiente programa muestra el rango de los enteros sin signo en C++
2/1/12 Mg. Edgar Ruiz Lizama 1111
#include <iostream.h>
#include <limits.h>
using namespace std;
int main() // sinsigno.cpp
{
cout<<endl<<"Entero sin signo maximo "<<UINT_MAX;
cout<<endl<<"Entero corto sin signo maximo "<<SHRT_MAX;
cout<<endl<<"Entero largo sin signo maximo "<<LONG_MAX;
cout<<endl<<"Caracter sin signo maximo "<<UCHAR_MAX;
cout<<endl;

return 0;
}
2/1/12 Mg. Edgar Ruiz Lizama 1212
NOTACION DE MAGNITUDES
CON SIGNO
Los nmeros en magnitud con signo se usan para representar enteros
positivos y negativos. La notacin de magnitud con signo no soporta
nmeros en punto flotante. Un nmero n-bit, A, en notacin de
magnitud con signo se representa como:
( ) { } 1 , 0 2 1
2
0
1

1
]
1

k
n
k
k
k
a
a donde a A
n
0 1 2 1
a a a a A
n n

Con un valor de:


2/1/12 Mg. Edgar Ruiz Lizama 1313
El rango de las magnitudes de notacin con signo es simtrico y el
cero es el nico no representado.
( ) 1 2 1 2
1 1

n n
A
Un nmero A es negativo si y solo si an-1 = 1. El rango de nmeros
en n-bit notacin de magnitud con signo es:
El siguiente programa muestra el rango de los enteros con signo en
C++.
2/1/12 Mg. Edgar Ruiz Lizama 1414
#include <iostream>
#include <limits.h>
using namespace std;
int main() //consigno.cpp
{
cout<<"\nEntero con signo maximo "<<INT_MAX<<endl;
cout<<"\nEntero con signo minimo "<<INT_MIN<<endl;
cout<<"\nEntero corto con signo maximo "<<SHRT_MAX<<endl;
cout<<"\nEntero largo con signo maximo "<<LONG_MAX<<endl;
cout<<"\nEntero largo con signo minimo "<<LONG_MIN<<endl;
cout<<"\nCaracter con signo maximo "<<SCHAR_MAX<<endl;
cout<<"\nCaracter con signo minimo "<<SCHAR_MIN<<endl;
return 0;
}
2/1/12 Mg. Edgar Ruiz Lizama 1515
OPERADORES PARA MANEJO
DE BITS
C y C++ poseen un conjunto de operadores especiales para el manejo de
bits, los cuales solo se pueden aplicar a operandos integrales tales como:
int, char y enum.
2/1/12 Mg. Edgar Ruiz Lizama 1616
Resultados de combinar dos bits mediante los
operadores & , | , ^ .
BIT1 BIT2 BIT1 & BIT2 BIT1 | BIT2 BIT1^BIT2
0 0 0 0 0
1 0 0 1 1
0 1 0 1 1
1 1 1 1 0
2/1/12 Mg. Edgar Ruiz Lizama 1717
#include <iostream> //para
system
#include <stdio.h> //para
putchar
void mostrarBits(unsigned);
using namespace std;
int main() //bits1.cpp
{ unsigned n;
cout<<"\nIngrese un entero
sin signo ";
cin>>n;
mostrarBits(n);
system("PAUSE");
return 0;
}
void mostrarBits(unsigned valor)
{ unsigned i, mostrarMask=1<<15;
cout<<valor<<"\t";
for(i=1; i<=16; i++)
{//enviar bit a bit a la salida
estandar
putchar(valor&mostrarMask?'1':'0');
valor<<=1;
if (i%8 == 0)
putchar(' ');
}
putchar('\n');
}
2/1/12 Mg. Edgar Ruiz Lizama 1818
NOTACION CON COMPLEMENTO
A DOS
La notacin con complemento a dos es usada por la mayora de las computadoras
para representar enteros positivos y enteros negativos. Un nmero n-bit, A, en
notacin con complemento a dos es representado como:
{ } 1 , 0 2 2
1
1
2
0

1
]
1

k
n
n
n
k
k
k
a a a A
0 1 2 1
a a a a A
n n

Con un valor de:


Un nmero A es negativo si y solo si an-1 = 1. De la ecuacin anterior, el negativo
de A; -A, est dado por:
1
1
2
0
2 2

+
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.

Vous aimerez peut-être aussi