Está en la página 1de 14

Cómo almacenan la hora los S.O.

Entonces
Es conocido que HH MM SS
existen 24 horas al día, 00 00 00
cada hora tiene 60 . . .
minutos, cada minuto . . .
tiene 60 segundos . . .
23 59 59
-------------------
24 x 60 x 60 = 86,400
combinaciones
01 bytes puede almacenar pow(2, 8) = 256 combinaciones
02 bytes puede almacenar pow(2,16) = 65,535 combinaciones
03 bytes puede almacenar pow(2,24) = 16’777,216 combinaciones

Luego para almacenar las 86,400 combinaciones necesitamos más


de 2 bytes pero menos de 3 bytes.
… almacenan la hora los S.O.
Por lo que será suficiente
Sin embargo no es necesario
almacenar la hora de
almacenar la hora de grabación
grabación del archivo con al
de un archivo con la precisión de
menos 2 segundos de
1 segundo, ya que nuestra
diferencia, por lo tanto:
reacción a la acción de grabar
tardará al menos ese segundo. HH MM SS
00 00 00
. . .
. . .
. . .
23 59 29
No es práctico reducir la precisión a ------------------
grabaciones a cada 2 minutos, 24 x 60 x 30 = 43,200
puesto que en un mismo minuto combinaciones
podremos hacer varias
grabaciones. que es menor que 65535, por lo que
caben cómodamente en 2 bytes
… almacenan la hora los S.O
Si cada segundo equivale a seg/2 entonces tendremos:
La hora 00:00:00 equivaldría a 0
La hora 00:00:01 equivaldría a 0
La hora 00:00:02 equivaldría a 1
La hora 00:00:03 equivaldría a 1
La hora 00:01:01 equivaldría a 31
La hora 22:31:08 equivaldría a 22(1800) + 31x 30 + 8/2 = 40534
Pero en computadoras es preferible hablar en potencias de 2, así en vez de
utilizar los factores 2, 30, 1800; debemos utilizar los factores 2, 32 y 2048 con
los cuales obtendremos el número que representa a la hora.
Número = Horas*2048 + Minutos*32 + Segundos/2

Por lo que su representación en memoria es mas adecuada y quedaría en 2


bytes como:
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

horas minutos seg/2


… almacenan la hora los S.O
Por ejemplo: para la hora 22:31:08 el número sería en realidad:
22*2048+31*32+8/2 = 46052, que se almacenaría como:

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
1 0 1 1 0 0 1 1 1 1 1 0 0 1 0 0

horas minutos seg/2

De esta manera se puede obtener el número a almacenar a partir de la hora,


o la hora a partir del número, realizando rápidamente divisiones por 2
utilizando desplazamientos de bits hacia la derecha, y multiplicaciones por 2
utilizando desplazamientos de bits hacia la izquierda.

Esta forma de almacenar las horas es utilizada por el DOS y WINDOWS para
almacenar la hora de creación y de última actualización de un archivo.
Escriba un programa que ingrese una hora y la
convierta a un número que la represente. Por
ejemplo la hora 22:31:08 es el número 46052.
Utilice el formato de almacenamiento de horas del
DOS y WINDOWS y manipulación de bits.
# include <iostream.h>
struct hora
{
int h;
int m;
int s;
};

void main(void)
{
struct hora h;
unsigned short int nroHora;
cout<<"Hora:" ; cin>>h.h;
cout<<"Minuto:" ; cin>>h.m;
cout<<"Segundo:"; cin>>h.s;

nroHora = (h.h<<11) + (h.m<<5) + (h.s>>1);


cout << "Número que representa la hora:“
<< nroHora << endl;
}
Escriba un programa que ingrese una hora y
muestre el número que la represente. Por ejemplo
la hora 22:31:08 es el número 46052. Utilice el
formato de almacenamiento de horas del DOS y
WINDOWS y Campos de Bits.
# include <iostream.h>
struct horaBits
{ unsigned s: 5;
unsigned m: 6;
unsigned h: 5;
};
union horaUnion
{ unsigned short nroHora;
struct horaBits hora;
};
void main(void)
{
union horaUnion hora;
int h, m, s;
cout<<"Hora :"; cin>>h;
cout<<"Minuto :"; cin>>m;
cout<<"Segundo:"; cin>>s;
hora.hora.h = h;
hora.hora.m = m;
hora.hora.s = (s>>1); // divide por 2 (almacena segundos pares)
cout<<"Número que representa la hora:" << hora.nroHora << endl;
}
Cómo almacenan la fecha los S.O.

La primera PC (Personal Computer) fue presentada en otoño de1981


por IBM, y por lo tanto en una PC no pueden existir archivos anteriores
a esta fecha.
Por esto el DOS y Windows toman como año de referencia a 1980, y
cuando creamos un archivo se almacena solo la diferencia respecto a
este año.
De esta manera podemos manejar a nivel de almacenamiento de
archivos y fechas del sistema desde 1980 hasta 2108 (1980+128), sin
embargo la última fecha posible de manejar con estos S.O. ha sido
definida hasta 31/12/2099.
Cómo almacenan la fecha los S.O.

• Como los días sólo pueden ser de 1a 31, será necesario 5 bits,
pues log2 (31) ~5 (2 elevado a la 5 es 32)

• Como los meses sólo pueden ser 12, entonces necesitamos 4 bits,
pues log2 (12) ~4 (2 elevado a la 4 es16)

• Como en 2 bytes hay 16 bits de los cuales ya utilizamos para el día


y el mes 5+4=9; nos quedan 7 bits con los cuales podemos
representar hasta 128 años (2 elevado a la 7).

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

Año Mes Día


Cómo almacenan la fecha los S.O.
Para almacenar la fecha Día/Mes/Año se almacenará un número de 2 bytes
dado por:
NroFecha = (Año-1980)*512 + Mes*32 + Día
El factor 32 (2 elevado a la 5) se incluye porque hay que desplazar 5 bits al mes
(el día ocupa los primeros 5 bits y no podemos sobreescribirlos).
El factor 512 (2 elevado a la 9) se incluye porque hay que desplazar 9 bits al año
(el día ocupa los primeros 5 bits, el mes los 4 siguientes y no podemos
sobreescribirlos).
Por ejemplo, para almacenar la fecha 25 diciembre de 2005, se almacenará el
número entero sin signo
NroFecha = (2006-1980)*512 + 12*32 + 25 = 13721
Dec Bin
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 Día 25 1101
0 0 1 1 0 1 0 1 1 0 0 1 1 0 0 1 Mes 12 1100
Año -1980 26 1101

Año Mes Día


Cómo almacenan la fecha los S.O.
Todo archivo en DOS tiene como atributo la fecha de creación, mientras
que WINDOWS además contiene la fecha de la última modificación.
Todos los sistemas compatibles con DOS y WINDOWS y con su forma
de almacenar archivos FAT o VFAT, utilizan 2 bytes para almacenar la
fecha.
En algún momento desde la actualidad hasta antes del año 2099 (o del
2108, si es que lanzan una versión que soporte hasta ese año), deberá
cambiarse la forma de almacenar las fechas, incluidas el formato FAT y
VFAT, debiendo convertir todos nuestro archivos hacia el nuevo formato
de almacenamiento, con todas las incomodidades que esto supone. En
la actualidad existen otros formatos como el NTFS pero el mas utilizado
es el FAT.
Este problema posiblemente se llamará El problema del siglo 22 o algo
parecido.
Escriba un programa que ingrese una fecha y la
convierta a un número que la represente. Por
ejemplo el número 13721 representa la fecha
25/12/2006.
Utilice el formato de almacenamiento de fechas
del DOS y WINDOWS y manipulación de bits.
# include <iostream.h>
struct fecha
{
int dia;
int mes;
int annio;
};
void main(void)
{
struct fecha f;
unsigned short int nroFecha;
cout<<"Número que representa fecha? ";
cin>>nroFecha;
f.dia = nroFecha & 0x001F;
f.mes = (nroFecha & 0x01E0)>>5;
f.annio= ( (nroFecha & 0xFE00) >>9 ) + 1980;

cout<<"Día:“ << f.dia << endl;


cout<<"Mes:"<< f.mes << endl;
cout<<"Año:"<< f.annio<< endl;
}

También podría gustarte