SlideShare una empresa de Scribd logo
Leandro Luciano Gagliardi
lgagliardi@unsam.edu.ar
Unions, Enum, Typedef,
Bit field operators
2
Las uniones es un tipo de dato similar a las estructuras. La principal
diferencia es la forma en que la memoria es reservada para los miembros. En
una estructura, cada miembro tiene su propia ubicación en memoria, mientras
que en la unión comparten la misma dirección en memoria. Cuando se
declara un tipo de variable union, el compilador reserva la cantidad de
memoria suficiente como para que la variable de mayor tamaño pueda ser
guardada. Se usan para ahorrar memoria.
Uniones
3
Aquí union es una palabra reservada que le dice al compilador que se está
definiendo una unión. member1, member2 ............... memberN son
miembros y se declaran dentro de llaves. tagname es el nombre de la unión
que se usa más adelante en el programa para declarar variables de este tipo.
union tagname {
datatype member1;
datatype member2;
…
…
datatype memberN;
};
Uniones
union credentials {
int dni;
long int clientID;
char email[40];
};
4
Declaración de Uniones
Se pueden declarar de dos formas:
● Con la definición de la unión.
● Usando el tagname de la unión.
5
Declaración con la definición de la unión
El tagname en este caso puede usarse o no. Depende el caso. Si no vamos
a declarar ninguna otra variable de tipo union credentials, no será
necesario.
union credentials {
int dni;
long int clientID;
char email[40];
}cr1, cr2, cr3;
union {
int dni;
long int clientID;
char email[40];
}cr1, cr2, cr3;
6
Usando el tagname de la unión
En este caso lo único que hacemos es declarar la unión con el tagname para
luego definir variables de este tipo en otras partes del programa.
int any_function(int a){
union credentials cr1, cr2;
…
…
return b;
}
union credentials {
int dni;
long int clientID;
char email[40];
};
7
Acceso a los miembros
Para acceder a cada miembro de la unión escribimos lo siguiente:
● cr1.dni
● cr1.clientID
● cr1.email
union credentials {
int dni;
long int clientID;
char email[40];
}cr1;
8
Dirección de almacenamiento
Los miembros de la unión se almacenan en la misma dirección de memoria.
9
Tamaño de una unión
10
Ventajas de usar typedef
1. Hace que nuestros programas sean más legibles y comprensibles, ya
que podemos documentar nuestro programa dando nombres
significativos y descriptivos para los tipos existentes.
2. En las estructuras, es importante, ya que podemos dar un solo nombre a
la estructura, no necesitamos escribir la palabra clave struct
repetidamente.
3. Hace que nuestros programas sean más portátiles. Cuando el programa
se ejecuta en una máquina diferente en la que los tipos de datos
estándar están representados por una cantidad diferente de bytes, solo
se ha cambiado la declaración typedef.
11
Tamaño de una unión
c
i
f
f2
d
myUnion1_t
12
Array de uniones
Siguiendo con la unión credentials, podemos declarar un array de uniones
de este tipo de la siguiente manera:
int any_function(int a){
union credentials cr[40];
…
…
return b;
}
Esto significa que cr es un array de 40 elementos donde cada uno es un dato
del tipo union credentials con 3 miembros.
union credentials {
int dni;
long int clientID;
char email[40];
};
13
Endianess
Existen dos formas de ordenar los bytes.
● Big-Endian: el byte más significativo se almacena en la dirección más
baja.
● Little-Endian: el byte menos significativo se almacena en la dirección
más baja.
La familia de procesadores Intel utiliza el orden de bytes little-endian. La
familia de procesadores Motorola utiliza el orden de bytes big-endian.
Para saber la arquitectura de nuestro sistema podemos ejecutar el siguiente
comando:
$ lscpu
14
Endianess
Ejemplo:
Supongamos el siguiente entero en representación de 4 bytes: 5193
0000 0000 0000 0000 0001 0100 0100 1001
MSB LSB
En memoria se ve representado de la siguiente manera:
0001 0100
0000 0000
0100 1001
0000 0000
0000 0000
0001 0100
0000 0000
0100 1001
LSB
LSB
MSB
MSB
little-endian big-endian
2000
2002
2001
2003
2000
2002
2001
2003
15
Endianess
16
Array de uniones: Acceso a los miembros
En este caso lo único que hacemos es declarar la estructura con el tagname
para luego definir variables de este tipo en otras partes del programa.
un1[0].dni un1[0].clientID un1[0].email
un1[1].dni un1[1].clientID un1[1].email
un1[2].dni un1[2].clientID un1[2].email
… … …
un1[39].dni un1[39].clientID un1[39].email
union credentials {
int dni;
long int clientID;
char email[40];
};
union credentials un1[40]
17
“Array de distintos tipos de datos”
18
Las declaraciones typedef pueden parecer similares a las directivas #define,
pero son diferentes. La diferencia básica es que las declaraciones typedef
son interpretadas por el compilador mientras que las directivas #define son
procesadas por el preprocesador. En la directiva #define podemos definir
una expansión para cualquier texto mientras que en typedef solo podemos
definir nuevos nombres para tipos de datos.
Diferencia entre typedef y #define
19
Diferencia entre typedef y #define
struct var {
unsigned a:2;
unsigned b:5;
unsigned c:1;
unsigned d:3;
};
20
Hemos visto cómo acceder y manipular bits individuales o grupos de bits
usando operaciones bit a bit (bitwise operations). Los campos de bits
proporcionan un método alternativo para acceder a los bits. Un campo de
bits es una colección de bits adyacentes. Se define dentro de una
estructura, pero es diferente de otros miembros porque su tamaño se
especifica en números de bits. El tipo de datos de un campo de bits puede
ser int o unsigned int. Tomemos un ejemplo que muestra la sintaxis para
definir campos de bits.
Campos de bits
21
Campos de bits
22
No sería válido asignar ningún valor a un campo de bits fuera de su rango,
por ejemplo:
var.b = 54; /*Inválido*/
No podemos aplicar los operadores sizeof y address a los campos de bits.
Por lo tanto, no podemos usar scanf para ingresar un campo de bits.
scanf("%d", &var.a); /*Inválido*/
Podemos ingresar el valor en una variable temporal y luego asignarlo al
campo de bits:
scanf("%d", &temp);
var.a = temp;
Campos de bits
23
Campos de bits
24
Campos de bits
25
Otro problema sobre los campos de bits es si pueden cruzar límites enteros o
no.
Los dos primeros campos ocupan 25 bits, por lo que aún se pueden usar 7
bits para otro campo. Pero los bits necesarios para el siguiente campo de bits
son 10. Algunas implementaciones comienzan el siguiente campo a partir de
un nuevo entero y otras colocan el siguiente campo en 10 bits adyacentes, es
decir, 7 bits sin usar del entero anterior y 3 bits del siguiente entero.
Campos de bits
struct tag {
unsigned a:20;
unsigned b:5;
unsigned c:10;
};
26
Padding
27
A veces es necesario reemplazar números enteros como 0, 1, 2, 3, …, n por
nombres con mayor significado. Por ejemplo, considerando los meses del
año, podríamos reemplazar los números del 1 al 12 por los meses Enero a
Diciembre. De esta manera podemos usar enum como tipo de datos definido
por el usuario:
Enum
enum tag {
member1,
member2,
…
membern
};
28
Enum
29
Enum
Leandro Gagliardi
lgagliardi@unsam.edu.ar
Extra Slides
31
Para la portabilidad, es mejor especificar claramente signed o unsigned en
la declaración de los campos de bits, ya que un campo int puede ser tratado
como signado por algunos compiladores mientras que como no signado por
otros.
Si un campo de bits se define como signado, debe tener al menos 2 bits de
longitud porque un bit se usa para el signo.
Algunos compiladores asignan los campos de bits de derecha a izquierda,
mientras que otros pueden asignarlos de izquierda a derecha. Si los campos
de bits se asignan de derecha a izquierda, entonces el primer campo ocupa el
bit menos significativo. Si los campos de bits se asignan de izquierda a
derecha, entonces el primer campo ocupa el bit más significativo.
Campos de bits

Más contenido relacionado

PDF
2.Teoria-II PROGRAMACION SIEMENS TIA PORTAL NIVEL II
PPTX
Tipos de datos para C++
PPTX
Unidad 1
 
PPTX
Tipo de datos_c_
PPTX
TIPOS DE DATOS PARA C++
PPTX
Tipos de datos_para_c++
PDF
Elementos basicos de_programacion
PDF
ELEMENTOS DE PROGRA 30-05.pdf
2.Teoria-II PROGRAMACION SIEMENS TIA PORTAL NIVEL II
Tipos de datos para C++
Unidad 1
 
Tipo de datos_c_
TIPOS DE DATOS PARA C++
Tipos de datos_para_c++
Elementos basicos de_programacion
ELEMENTOS DE PROGRA 30-05.pdf

Similar a 10B- Unions, Enum, Typedef, Bit field operators.pdf (20)

PPT
Variables y constantes
DOCX
Tutorial C
PDF
07 - Tipos de datos definidos por el programador en lenguaje C: struct, typed...
PDF
Introduccion al lenguaje de programacion c
PDF
Lenguaje c
PDF
02. lenguaje c autor enrique vicente bonet esteban
PDF
Lenguaje c
PDF
Lenguaje c
PDF
Gran Libro de C en Español
PDF
Lenguaje C
PDF
02 - Conceptos fundamentales sobre tipos de datos en lenguaje C
PPTX
Introducción
PPTX
Introducción
PPTX
TUTORIAL LENGUAJE C
PPTX
TUTORIAL DE LENGUAJE C
PDF
Curso básico de ensamblador
PDF
Curso básico de Ensamblador
PPTX
Punteros y funciones abril agosto 2016
DOCX
Cesar ivan lenguaje_c
DOCX
Variables y constantes
Tutorial C
07 - Tipos de datos definidos por el programador en lenguaje C: struct, typed...
Introduccion al lenguaje de programacion c
Lenguaje c
02. lenguaje c autor enrique vicente bonet esteban
Lenguaje c
Lenguaje c
Gran Libro de C en Español
Lenguaje C
02 - Conceptos fundamentales sobre tipos de datos en lenguaje C
Introducción
Introducción
TUTORIAL LENGUAJE C
TUTORIAL DE LENGUAJE C
Curso básico de ensamblador
Curso básico de Ensamblador
Punteros y funciones abril agosto 2016
Cesar ivan lenguaje_c
Publicidad

Último (20)

PDF
Supervisión del PROC. 228_Osinergmin.pdf
PPTX
1 CONTAMINACION AMBIENTAL EN EL PLANETA.pptx
PPTX
NILS actividad 4 PRESENTACION.pptx pppppp
PPT
TRABAJOS EN ALTURA PARA OBRAS DE INGENIERIA
PPTX
Logging While Drilling Ingenieria Petrolera.pptx
DOCX
Cumplimiento normativo y realidad laboral
PDF
Sugerencias Didacticas 2023_Diseño de Estructuras Metalicas_digital.pdf
PDF
5 Presentación de PowerPointGENERACIÓN DESECHOS UIS 18-02-2023 (1).pdf
PPTX
Manual ISO9001_2015_IATF_16949_2016.pptx
PPTX
CAPACITACIÓN DE USO ADECUADO DE EPP.pptx
PPTX
leyes de los gases Ideales. combustible refinación
PDF
Copia de Presentación Propuesta de Marketing Corporativo Blanco y Negro.pdf
PDF
Informe Comision Investigadora Final distribución electrica años 2024 y 2025
PPT
357161027-seguridad-industrial-diapositivas-ppt.ppt
PDF
TESTAMENTO DE DESCRIPTIVA ..............
PPTX
Notificacion e investigación de incidentes y accidentes de trabajo.pptx
PDF
Primera formulación de cargos de la SEC en contra del CEN
PPT
PRIMEROS AUXILIOS EN EL SECTOR EMPRESARIAL
PPT
Sustancias Peligrosas de empresas para su correcto manejo
PPTX
GEOLOGIA, principios , fundamentos y conceptos
Supervisión del PROC. 228_Osinergmin.pdf
1 CONTAMINACION AMBIENTAL EN EL PLANETA.pptx
NILS actividad 4 PRESENTACION.pptx pppppp
TRABAJOS EN ALTURA PARA OBRAS DE INGENIERIA
Logging While Drilling Ingenieria Petrolera.pptx
Cumplimiento normativo y realidad laboral
Sugerencias Didacticas 2023_Diseño de Estructuras Metalicas_digital.pdf
5 Presentación de PowerPointGENERACIÓN DESECHOS UIS 18-02-2023 (1).pdf
Manual ISO9001_2015_IATF_16949_2016.pptx
CAPACITACIÓN DE USO ADECUADO DE EPP.pptx
leyes de los gases Ideales. combustible refinación
Copia de Presentación Propuesta de Marketing Corporativo Blanco y Negro.pdf
Informe Comision Investigadora Final distribución electrica años 2024 y 2025
357161027-seguridad-industrial-diapositivas-ppt.ppt
TESTAMENTO DE DESCRIPTIVA ..............
Notificacion e investigación de incidentes y accidentes de trabajo.pptx
Primera formulación de cargos de la SEC en contra del CEN
PRIMEROS AUXILIOS EN EL SECTOR EMPRESARIAL
Sustancias Peligrosas de empresas para su correcto manejo
GEOLOGIA, principios , fundamentos y conceptos
Publicidad

10B- Unions, Enum, Typedef, Bit field operators.pdf

  • 1. Leandro Luciano Gagliardi lgagliardi@unsam.edu.ar Unions, Enum, Typedef, Bit field operators
  • 2. 2 Las uniones es un tipo de dato similar a las estructuras. La principal diferencia es la forma en que la memoria es reservada para los miembros. En una estructura, cada miembro tiene su propia ubicación en memoria, mientras que en la unión comparten la misma dirección en memoria. Cuando se declara un tipo de variable union, el compilador reserva la cantidad de memoria suficiente como para que la variable de mayor tamaño pueda ser guardada. Se usan para ahorrar memoria. Uniones
  • 3. 3 Aquí union es una palabra reservada que le dice al compilador que se está definiendo una unión. member1, member2 ............... memberN son miembros y se declaran dentro de llaves. tagname es el nombre de la unión que se usa más adelante en el programa para declarar variables de este tipo. union tagname { datatype member1; datatype member2; … … datatype memberN; }; Uniones union credentials { int dni; long int clientID; char email[40]; };
  • 4. 4 Declaración de Uniones Se pueden declarar de dos formas: ● Con la definición de la unión. ● Usando el tagname de la unión.
  • 5. 5 Declaración con la definición de la unión El tagname en este caso puede usarse o no. Depende el caso. Si no vamos a declarar ninguna otra variable de tipo union credentials, no será necesario. union credentials { int dni; long int clientID; char email[40]; }cr1, cr2, cr3; union { int dni; long int clientID; char email[40]; }cr1, cr2, cr3;
  • 6. 6 Usando el tagname de la unión En este caso lo único que hacemos es declarar la unión con el tagname para luego definir variables de este tipo en otras partes del programa. int any_function(int a){ union credentials cr1, cr2; … … return b; } union credentials { int dni; long int clientID; char email[40]; };
  • 7. 7 Acceso a los miembros Para acceder a cada miembro de la unión escribimos lo siguiente: ● cr1.dni ● cr1.clientID ● cr1.email union credentials { int dni; long int clientID; char email[40]; }cr1;
  • 8. 8 Dirección de almacenamiento Los miembros de la unión se almacenan en la misma dirección de memoria.
  • 10. 10 Ventajas de usar typedef 1. Hace que nuestros programas sean más legibles y comprensibles, ya que podemos documentar nuestro programa dando nombres significativos y descriptivos para los tipos existentes. 2. En las estructuras, es importante, ya que podemos dar un solo nombre a la estructura, no necesitamos escribir la palabra clave struct repetidamente. 3. Hace que nuestros programas sean más portátiles. Cuando el programa se ejecuta en una máquina diferente en la que los tipos de datos estándar están representados por una cantidad diferente de bytes, solo se ha cambiado la declaración typedef.
  • 11. 11 Tamaño de una unión c i f f2 d myUnion1_t
  • 12. 12 Array de uniones Siguiendo con la unión credentials, podemos declarar un array de uniones de este tipo de la siguiente manera: int any_function(int a){ union credentials cr[40]; … … return b; } Esto significa que cr es un array de 40 elementos donde cada uno es un dato del tipo union credentials con 3 miembros. union credentials { int dni; long int clientID; char email[40]; };
  • 13. 13 Endianess Existen dos formas de ordenar los bytes. ● Big-Endian: el byte más significativo se almacena en la dirección más baja. ● Little-Endian: el byte menos significativo se almacena en la dirección más baja. La familia de procesadores Intel utiliza el orden de bytes little-endian. La familia de procesadores Motorola utiliza el orden de bytes big-endian. Para saber la arquitectura de nuestro sistema podemos ejecutar el siguiente comando: $ lscpu
  • 14. 14 Endianess Ejemplo: Supongamos el siguiente entero en representación de 4 bytes: 5193 0000 0000 0000 0000 0001 0100 0100 1001 MSB LSB En memoria se ve representado de la siguiente manera: 0001 0100 0000 0000 0100 1001 0000 0000 0000 0000 0001 0100 0000 0000 0100 1001 LSB LSB MSB MSB little-endian big-endian 2000 2002 2001 2003 2000 2002 2001 2003
  • 16. 16 Array de uniones: Acceso a los miembros En este caso lo único que hacemos es declarar la estructura con el tagname para luego definir variables de este tipo en otras partes del programa. un1[0].dni un1[0].clientID un1[0].email un1[1].dni un1[1].clientID un1[1].email un1[2].dni un1[2].clientID un1[2].email … … … un1[39].dni un1[39].clientID un1[39].email union credentials { int dni; long int clientID; char email[40]; }; union credentials un1[40]
  • 17. 17 “Array de distintos tipos de datos”
  • 18. 18 Las declaraciones typedef pueden parecer similares a las directivas #define, pero son diferentes. La diferencia básica es que las declaraciones typedef son interpretadas por el compilador mientras que las directivas #define son procesadas por el preprocesador. En la directiva #define podemos definir una expansión para cualquier texto mientras que en typedef solo podemos definir nuevos nombres para tipos de datos. Diferencia entre typedef y #define
  • 20. struct var { unsigned a:2; unsigned b:5; unsigned c:1; unsigned d:3; }; 20 Hemos visto cómo acceder y manipular bits individuales o grupos de bits usando operaciones bit a bit (bitwise operations). Los campos de bits proporcionan un método alternativo para acceder a los bits. Un campo de bits es una colección de bits adyacentes. Se define dentro de una estructura, pero es diferente de otros miembros porque su tamaño se especifica en números de bits. El tipo de datos de un campo de bits puede ser int o unsigned int. Tomemos un ejemplo que muestra la sintaxis para definir campos de bits. Campos de bits
  • 22. 22 No sería válido asignar ningún valor a un campo de bits fuera de su rango, por ejemplo: var.b = 54; /*Inválido*/ No podemos aplicar los operadores sizeof y address a los campos de bits. Por lo tanto, no podemos usar scanf para ingresar un campo de bits. scanf("%d", &var.a); /*Inválido*/ Podemos ingresar el valor en una variable temporal y luego asignarlo al campo de bits: scanf("%d", &temp); var.a = temp; Campos de bits
  • 25. 25 Otro problema sobre los campos de bits es si pueden cruzar límites enteros o no. Los dos primeros campos ocupan 25 bits, por lo que aún se pueden usar 7 bits para otro campo. Pero los bits necesarios para el siguiente campo de bits son 10. Algunas implementaciones comienzan el siguiente campo a partir de un nuevo entero y otras colocan el siguiente campo en 10 bits adyacentes, es decir, 7 bits sin usar del entero anterior y 3 bits del siguiente entero. Campos de bits struct tag { unsigned a:20; unsigned b:5; unsigned c:10; };
  • 27. 27 A veces es necesario reemplazar números enteros como 0, 1, 2, 3, …, n por nombres con mayor significado. Por ejemplo, considerando los meses del año, podríamos reemplazar los números del 1 al 12 por los meses Enero a Diciembre. De esta manera podemos usar enum como tipo de datos definido por el usuario: Enum enum tag { member1, member2, … membern };
  • 31. 31 Para la portabilidad, es mejor especificar claramente signed o unsigned en la declaración de los campos de bits, ya que un campo int puede ser tratado como signado por algunos compiladores mientras que como no signado por otros. Si un campo de bits se define como signado, debe tener al menos 2 bits de longitud porque un bit se usa para el signo. Algunos compiladores asignan los campos de bits de derecha a izquierda, mientras que otros pueden asignarlos de izquierda a derecha. Si los campos de bits se asignan de derecha a izquierda, entonces el primer campo ocupa el bit menos significativo. Si los campos de bits se asignan de izquierda a derecha, entonces el primer campo ocupa el bit más significativo. Campos de bits