Tipos de datos C

Tipos de datos admitidos por el lenguaje de programación C

En el lenguaje de programación C , los tipos de datos constituyen la semántica y las características de almacenamiento de los elementos de datos. Se expresan en la sintaxis del lenguaje en forma de declaraciones de ubicaciones de memoria o variables . Los tipos de datos también determinan los tipos de operaciones o métodos de procesamiento de los elementos de datos.

El lenguaje C proporciona tipos aritméticos básicos, como tipos de números enteros y reales , y sintaxis para construir tipos de matriz y compuestos. Los encabezados de la biblioteca estándar de C , que se utilizan a través de directivas de inclusión , contienen definiciones de tipos de soporte, que tienen propiedades adicionales, como proporcionar almacenamiento con un tamaño exacto, independientemente de la implementación del lenguaje en plataformas de hardware específicas. [1] [2]

Tipos primarios

Tipos principales

El lenguaje C proporciona los cuatro especificadores de tipo aritmético básicos char , int , float y double , y los modificadores signed , unsigned , short y long . La siguiente tabla enumera las combinaciones permitidas para especificar un conjunto grande de declaraciones específicas del tamaño de almacenamiento.

TipoExplicaciónTamaño mínimo (bits)Especificador de formatoRangoSufijo para constantes decimales
carbonizarseUnidad direccionable más pequeña de la máquina que puede contener un conjunto de caracteres básicos. Es un tipo entero . El tipo real puede ser con signo o sin signo. Contiene bits CHAR_BIT. [3]8%c[ CARACTER_MIN , CARACTER_MAX ]
carácter firmadoDel mismo tamaño que char , pero se garantiza que tiene signo. Capaz de contener al menos el rango [−127, +127] . [3] [a]8%c[b][ SCHAR_MÍN , SCHAR_MÁX ] [6]
carácter sin signoDel mismo tamaño que char , pero se garantiza que no tiene signo. Contiene al menos el rango [0, 255] . [7]8%c[do][0, UCHAR_MAX ]
  • corto
  • int corto
  • firmado corto
  • entero corto firmado
Tipo entero con signo corto . Capaz de contener al menos el [−32 767 ,+32 767 ] rango. [3] [a]16%hio%hd[ CORTE MÍNIMO , CORTE MÁXIMO ]
  • corto sin firmar
  • entero corto sin signo
Tipo entero corto sin signo. Contiene al menos el [0 ,65 535 ] rango. [3]16%hu[0, Tiempo máximo de uso ]
  • entero
  • firmado
  • entero firmado
Tipo entero con signo básico. Capaz de contener al menos el [−32 767 ,+32 767 ] rango. [3] [a]16%io%d[ INT_MÍN , INT_MÁX ]Ninguno [8]
  • no firmado
  • entero sin signo
Tipo entero básico sin signo. Contiene al menos el [0 ,65 535 ] rango. [3]16%u[0, UINT_MAX ]u o U [8]
  • largo
  • entero largo
  • firmado largo
  • entero largo firmado
Tipo entero con signo largo . Capaz de contener al menos el [−2 147 483 647 ,+2 147 483 647 ] rango. [3] [a]32%lio%ld[ LARGO_MÍN , LARGO_MÁX ]l o L [8]
  • largo sin firmar
  • entero largo sin signo
Tipo entero largo sin signo. Capaz de contener al menos el [0 ,4 294 967 295 ] rango. [3]32%lu[0, ULONG_MÁXIMO ]tanto u o U como l o L [8]
  • largo largo
  • largo largo int
  • firmado largo largo
  • firmado largo largo int
Tipo entero con signo largo . Capaz de contener al menos el [−9 223 372 036 854 775 807 ,+9 223 372 036 854 775 807 ] . [3] [a] Especificado desde la versión C99 del estándar.64%llio%lld[ LARGO_MÍNIMO , LARGO_MÁXIMO ]ll o LL [8]
  • largo sin firmar
  • entero largo sin signo
Tipo entero sin signo de longitud larga . Contiene al menos [0 ,18 446 744 073 709 551 615 ] . [3] Especificado desde la versión C99 del estándar.64%llu[0, LARGO_MÁXIMO ]tanto u o U como ll o LL [8]
flotarTipo de punto flotante real, al que normalmente se hace referencia como tipo de punto flotante de precisión simple. No se especifican las propiedades reales (excepto los límites mínimos); sin embargo, en la mayoría de los sistemas, este es el formato de punto flotante binario de precisión simple IEEE 754 (32 bits). Este formato es requerido por el Anexo F opcional "Aritmética de punto flotante IEC 60559".Conversión de texto: [d]
  • %f %F
  • %g %G
  • %e %E
  • %a %A
f o F
dobleTipo de punto flotante real, al que normalmente se hace referencia como tipo de punto flotante de doble precisión. No se especifican las propiedades reales (excepto los límites mínimos); sin embargo, en la mayoría de los sistemas, este es el formato de punto flotante binario de doble precisión IEEE 754 (64 bits). Este formato es requerido por el Anexo F opcional "Aritmética de punto flotante IEC 60559".
  • %lf %lF
  • %lg %lG
  • %le %lE
  • %la %lA[mi]
ninguno
largo dobleTipo de punto flotante real, generalmente asignado a un formato de número de punto flotante de precisión extendida . Propiedades reales no especificadas. Puede ser el formato de punto flotante de precisión extendida x86 (80 bits, pero normalmente 96 bits o 128 bits en memoria con bytes de relleno ), el formato de punto flotante de precisión cuádruple IEEE 754 ( 128 bits) o el mismo que double. Consulte el artículo sobre long double para obtener más detalles.%Lf %LF
%Lg %LG
%Le %LE
%La %LA[mi]
l o L
  1. ^ abcde Los rangos mínimos [−(2 n −1 −1), 2 n −1 −1] (por ejemplo, [−127,127]) provienen de las diversas representaciones de números enteros permitidas por el estándar ( complemento a uno , signo-magnitud , complemento a dos ). [4] Sin embargo, la mayoría de las plataformas usan complemento a dos, lo que implica un rango de la forma [−2 m −1 , 2 m −1 −1] con mn para estas implementaciones, por ejemplo, [−128,127] ( SCHAR_MIN == −128y ) para un char con signo deSCHAR_MAX == 127 8 bits . Desde C23, la única representación permitida es el complemento a dos, por lo tanto, los valores varían desde al menos [−2 n −1 , 2 n −1 −1] . [5]
  2. ^ o %hhipara salida numérica
  3. ^ o %hhupara salida numérica
  4. ^ Estas cadenas de formato también existen para formatear texto, pero operan en un doble.
  5. ^ ab Las mayúsculas difieren de las minúsculas en la salida. Los especificadores de mayúsculas producen valores en mayúsculas y los de minúsculas en minúsculas (%A, %E, %F, %G producen valores como INF, NAN y E (exponente) en mayúsculas)

El tamaño real de los tipos enteros varía según la implementación. El estándar solo requiere relaciones de tamaño entre los tipos de datos y tamaños mínimos para cada tipo de datos:

Los requisitos de la relación son que long longno sea menor que long , que no es menor que int , que no es menor que short . Como el tamaño de char es siempre el tipo de datos mínimo admitido, ningún otro tipo de datos (excepto los campos de bits ) puede ser menor.

El tamaño mínimo para char es de 8 bits, el tamaño mínimo para short e int es de 16 bits, para long es de 32 bits y debe contener al menos 64 bits.long long

El tipo int debe ser el tipo entero con el que el procesador de destino trabaja de forma más eficiente. Esto permite una gran flexibilidad: por ejemplo, todos los tipos pueden ser de 64 bits. Sin embargo, son populares varios esquemas de ancho de entero diferentes (modelos de datos). Debido a que el modelo de datos define cómo se comunican los diferentes programas, se utiliza un modelo de datos uniforme dentro de una interfaz de aplicación del sistema operativo determinada. [9]

En la práctica, char suele tener un tamaño de 8 bits y short de 16 bits (al igual que sus contrapartes sin signo). Esto es válido para plataformas tan diversas como SunOS  4 Unix de los años 90, Microsoft MS-DOS , Linux moderno y Microchip MCC18 para microcontroladores PIC de 8 bits integrados . POSIX requiere que char tenga exactamente 8 bits de tamaño. [10] [11]

Varias reglas en el estándar C hacen que unsigned charel tipo básico usado para arreglos sea adecuado para almacenar objetos arbitrarios que no sean campos de bits: su falta de bits de relleno y representaciones de trampa, la definición de representación de objeto , [7] y la posibilidad de alias. [12]

El tamaño y el comportamiento reales de los tipos de punto flotante también varían según la implementación. El único requisito es que long doubleno sea menor que double , que no es menor que float . Por lo general, se utilizan los formatos de punto flotante binario IEEE 754 de 32 y 64 bits para float y double respectivamente.

El estándar C99 incluye nuevos tipos de punto flotante reales float_t y double_t , definidos en . Corresponden a los tipos utilizados para los resultados intermedios de expresiones de punto flotante cuando FLT_EVAL_METHOD es 0, 1 o 2. Estos tipos pueden ser más amplios que .<math.h>long double

C99 también agregó tipos complejosfloat _Complex : , double _Complex, long double _Complex. C11 agregó tipos imaginarios (que se describieron en un anexo informativo de C99): float _Imaginary, double _Imaginary, long double _Imaginary. La inclusión del encabezado <complex.h>permite acceder a todos estos tipos utilizando complex e imaginary respectivamente.

Tipo booleano

C99 agregó un tipo de datos booleano _Bool . Además, el <stdbool.h>encabezado define boolcomo un alias conveniente para este tipo y también proporciona macros para truey false. _Boolfunciona de manera similar a un tipo entero normal, con una excepción: cualquier asignación a a _Boolque no sea 0 (falso) se almacena como 1 (verdadero). Este comportamiento existe para evitar desbordamientos de enteros en conversiones de restricción implícitas. Por ejemplo, en el siguiente código:

carácter sin signo b = 256 ;    si ( b ) { /* hacer algo */ }  

La variable bse evalúa como falsa si unsigned chartiene un tamaño de 8 bits. Esto se debe a que el valor 256 no cabe en el tipo de datos, lo que hace que se utilicen los 8 bits inferiores, lo que da como resultado un valor cero. Sin embargo, al cambiar el tipo, el código anterior se comporta normalmente:

_Bool b = 256 ;   si ( b ) { /* hacer algo */ }  

El tipo _Bool también garantiza que los valores verdaderos siempre sean iguales entre sí:

_Bool a = 1 , b = 2 ;      si ( a == b ) { /* este código se ejecutará */ }    

Tipos enteros con precisión de bits

Desde C23 , el lenguaje permite al programador definir números enteros que tienen un ancho de un número arbitrario de bits. Esos tipos se especifican como , donde N es una expresión constante entera que denota el número de bits, incluido el bit de signo para los tipos con signo, representados en complemento a dos. El valor máximo de N lo proporciona y es al menos . Por lo tanto, el tipo (o ) toma valores de −2 a 1 mientras que toma valores de 0 a 3. El tipo también existe, ya sea 0 o 1 y no tiene un tipo con signo equivalente. [13]_BitInt(N)BITINT_MAXWIDTHULLONG_WIDTH_BitInt(2)signed _BitInt(2)unsigned _BitInt(2)unsigned _BitInt(1)

Diferencias de tamaño y tipos de puntero

La especificación del lenguaje C incluye los tipos de definiciones y para representar cantidades relacionadas con la memoria. Su tamaño se define de acuerdo con las capacidades aritméticas del procesador de destino, no de las capacidades de memoria, como el espacio de direcciones disponible. Ambos tipos se definen en el encabezado ( en C++).size_tptrdiff_t<stddef.h>cstddef

size_tes un tipo entero sin signo que se utiliza para representar el tamaño de cualquier objeto (incluidas las matrices) en la implementación particular. El operador sizeof produce un valor del tipo . El tamaño máximo de se proporciona mediante , una constante macro que se define en el encabezado ( header en C++). se garantiza que tenga al menos 16 bits de ancho. Además, POSIX incluye , que es un tipo entero con signo del mismo ancho que .size_tsize_tSIZE_MAX<stdint.h>cstdintsize_tssize_tsize_t

ptrdiff_tes un tipo entero con signo que se utiliza para representar la diferencia entre punteros. Se garantiza que solo es válido para punteros del mismo tipo; la resta de punteros que constan de tipos diferentes está definida por la implementación.

Interfaz con las propiedades de los tipos básicos

La información sobre las propiedades reales, como el tamaño, de los tipos aritméticos básicos se proporciona a través de constantes macro en dos encabezados: <limits.h>header ( climitsheader en C++) define macros para tipos enteros y <float.h>header ( cfloatheader en C++) define macros para tipos de punto flotante. Los valores reales dependen de la implementación.

Propiedades de los tipos enteros

  • CHAR_BIT– tamaño del tipo char en bits, comúnmente denominado tamaño de un byte (al menos 8 bits)
  • SCHAR_MIN, SHRT_MIN, INT_MIN, LONG_MIN, LLONG_MIN(C99) – valor mínimo posible de tipos enteros con signo: signed char, signed short, signed int, signed long, signed long long
  • SCHAR_MAX, SHRT_MAX, INT_MAX, LONG_MAX, LLONG_MAX(C99) – valor máximo posible de tipos enteros con signo: signed char, signed short, signed int, signed long, signed long long
  • UCHAR_MAX, USHRT_MAX, UINT_MAX, ULONG_MAX, ULLONG_MAX(C99) – valor máximo posible de tipos enteros sin signo: unsigned char, unsigned short, unsigned int, unsigned long, unsigned long long
  • CHAR_MIN– valor mínimo posible de char
  • CHAR_MAX– valor máximo posible de char
  • MB_LEN_MAX– número máximo de bytes en un carácter multibyte
  • BOOL_WIDTH(C23) - ancho de bit de _Bool, siempre 1
  • CHAR_WIDTH(C23) - ancho de bit de char; CHAR_WIDTH, UCHAR_WIDTHy SCHAR_WIDTHson iguales a CHAR_BITpor definición
  • SCHAR_WIDTH, SHRT_WIDTH, INT_WIDTH, LONG_WIDTH, LLONG_WIDTH(C23) - ancho de bit de signed char, short, int, long, y long longrespectivamente
  • UCHAR_WIDTH, USHRT_WIDTH, UINT_WIDTH, ULONG_WIDTH, ULLONG_WIDTH(C23) - ancho de bit de unsigned char, unsigned short, unsigned int, unsigned long, y unsigned long longrespectivamente

Propiedades de los tipos de punto flotante

  • FLT_MIN, DBL_MIN, LDBL_MIN– valor positivo normalizado mínimo de float, double, long double respectivamente
  • FLT_TRUE_MIN, DBL_TRUE_MIN, LDBL_TRUE_MIN(C11) – valor positivo mínimo de float, double, long double respectivamente
  • FLT_MAX, DBL_MAX, LDBL_MAX– valor finito máximo de float, double, long double, respectivamente
  • FLT_ROUNDS– modo de redondeo para operaciones de punto flotante
  • FLT_EVAL_METHOD(C99) – método de evaluación de expresiones que involucran diferentes tipos de punto flotante
  • FLT_RADIX– base del exponente en los tipos de punto flotante
  • FLT_DIG, DBL_DIG, LDBL_DIG– número de dígitos decimales que se pueden representar sin perder precisión mediante float, double, long double, respectivamente
  • FLT_EPSILON, DBL_EPSILON, LDBL_EPSILONdiferencia entre 1.0 y el siguiente valor representable de float, double, long double, respectivamente
  • FLT_MANT_DIG, DBL_MANT_DIG, LDBL_MANT_DIG– número de FLT_RADIXdígitos de base en el significado de punto flotante para los tipos float, double, long double, respectivamente
  • FLT_MIN_EXP, DBL_MIN_EXP, LDBL_MIN_EXP– mínimo entero negativo tal que FLT_RADIXelevado a una potencia uno menor que ese número es un float normalizado, double, long double, respectivamente
  • FLT_MIN_10_EXP, DBL_MIN_10_EXP, LDBL_MIN_10_EXP– mínimo entero negativo tal que 10 elevado a esa potencia es un float normalizado, double, long double, respectivamente
  • FLT_MAX_EXP, DBL_MAX_EXP, LDBL_MAX_EXP– entero positivo máximo tal que FLT_RADIXelevado a una potencia uno menor que ese número es un float normalizado, double, long double, respectivamente
  • FLT_MAX_10_EXP, DBL_MAX_10_EXP, LDBL_MAX_10_EXP– entero positivo máximo tal que 10 elevado a esa potencia es un float normalizado, double, long double, respectivamente
  • DECIMAL_DIG(C99) – número mínimo de dígitos decimales tal que cualquier número del tipo de punto flotante admitido más amplio puede representarse en decimal con una precisión de DECIMAL_DIGdígitos y leerse nuevamente en el tipo de punto flotante original sin cambiar su valor. DECIMAL_DIGes al menos 10.

Tipos enteros de ancho fijo

El estándar C99 incluye definiciones de varios tipos de enteros nuevos para mejorar la portabilidad de los programas. [2] Los tipos de enteros básicos ya disponibles se consideraron insuficientes, porque sus tamaños reales están definidos por la implementación y pueden variar entre diferentes sistemas. Los nuevos tipos son especialmente útiles en entornos integrados donde el hardware generalmente admite solo varios tipos y ese soporte varía entre diferentes entornos. Todos los tipos nuevos se definen en <inttypes.h>header ( cinttypesheader en C++) y también están disponibles en <stdint.h>header ( cstdintheader en C++). Los tipos se pueden agrupar en las siguientes categorías:

  • Tipos enteros de ancho exacto que tienen la misma cantidad de bits n en todas las implementaciones. Se incluyen solo si están disponibles en la implementación.
  • Tipos enteros de menor ancho que se garantiza que son el tipo más pequeño disponible en la implementación y que tienen al menos un número especificado de n bits. Se garantiza que se especificarán al menos para N = 8, 16, 32, 64.
  • Tipos enteros más rápidos que se garantiza que son los tipos enteros más rápidos disponibles en la implementación, que tienen al menos un número especificado de n bits. Se garantiza que se especificarán para al menos N = 8, 16, 32, 64.
  • Tipos enteros de puntero que se garantiza que pueden contener un puntero. Se incluyen solo si están disponibles en la implementación.
  • Tipos enteros de ancho máximo que se garantiza que serán el tipo entero más grande en la implementación.

La siguiente tabla resume los tipos y la interfaz para adquirir los detalles de implementación ( n se refiere al número de bits):

Categoría de tipoTipos firmadosTipos sin signo
TipoValor mínimoValor máximoTipoValor mínimoValor máximo
Ancho exactointn_tINTn_MININTn_MAXuintn_t0UINTn_MAX
Ancho mínimoint_leastn_tINT_LEASTn_MININT_LEASTn_MAXuint_leastn_t0UINT_LEASTn_MAX
Lo más rápidoint_fastn_tINT_FASTn_MININT_FASTn_MAXuint_fastn_t0UINT_FASTn_MAX
Punterointptr_tINTPTR_MININTPTR_MAXuintptr_t0UINTPTR_MAX
Ancho máximointmax_tINTMAX_MININTMAX_MAXuintmax_t0UINTMAX_MAX

Especificadores de formato printf y scanf

El <inttypes.h>encabezado ( cinttypesen C++) proporciona características que mejoran la funcionalidad de los tipos definidos en el <stdint.h>encabezado. Define macros para los especificadores de cadena de formato printf y scanf correspondientes a los tipos definidos en <stdint.h>y varias funciones para trabajar con los tipos intmax_ty uintmax_t. Este encabezado se agregó en C99 .

Cadena de formato printf

Las macros tienen el formato . Aquí {fmt} define el formato de salida y puede ser (decimal), (hexadecimal), (octal), (sin signo) y (entero). {type} define el tipo del argumento y puede ser , , , , , donde corresponde al número de bits del argumento.PRI{fmt}{type}dxouinFASTnLEASTnPTRMAXn

Cadena de formato scanf

Las macros tienen el formato . Aquí {fmt} define el formato de salida y puede ser (decimal), (hexadecimal), (octal), (sin signo) y (entero). {type} define el tipo del argumento y puede ser , , , , , donde corresponde al número de bits del argumento.SCN{fmt}{type}dxouinFASTnLEASTnPTRMAXn

Funciones

Tipos de punto flotante adicionales

De manera similar a los tipos enteros de ancho fijo, ISO/IEC TS 18661 especifica tipos de punto flotante para el intercambio IEEE 754 y formatos extendidos en binario y decimal:

  • _FloatNpara formatos de intercambio binario;
  • _DecimalNpara formatos de intercambio decimal;
  • _FloatNxpara formatos binarios extendidos;
  • _DecimalNxpara formatos decimales extendidos.

Estructuras

Las estructuras agregan el almacenamiento de múltiples elementos de datos, de tipos de datos potencialmente diferentes, en un bloque de memoria al que hace referencia una única variable. El siguiente ejemplo declara el tipo de datos struct birthdayque contiene el nombre y la fecha de nacimiento de una persona. La definición de la estructura va seguida de una declaración de la variable Johnque asigna el almacenamiento necesario.

struct cumpleaños { char nombre [ 20 ]; int día ; int mes ; int año ; };      estructura cumpleaños juan ;  

La distribución de la memoria de una estructura es un problema de implementación del lenguaje para cada plataforma, con algunas restricciones. La dirección de memoria del primer miembro debe ser la misma que la dirección de la estructura misma. Las estructuras pueden inicializarse o asignarse mediante literales compuestos. Una función puede devolver directamente una estructura, aunque esto a menudo no es eficiente en tiempo de ejecución. Desde C99 , una estructura también puede terminar con un miembro de matriz flexible .

Una estructura que contiene un puntero a una estructura de su propio tipo se utiliza comúnmente para construir estructuras de datos vinculadas :

struct nodo { int val ; struct nodo * siguiente ; };     

Matrices

Para cada tipo T, excepto los tipos void y function, existen los tipos "array de Nelementos de tipo T" . Un array es una colección de valores, todos del mismo tipo, almacenados de forma contigua en la memoria. Un array de tamaño Nestá indexado por números enteros desde 0hasta inclusive N−1. A continuación se muestra un breve ejemplo:

int cat [ 10 ]; // matriz de 10 elementos, cada uno de tipo int  

Las matrices se pueden inicializar con un inicializador compuesto, pero no se pueden asignar. Las matrices se pasan a funciones pasando un puntero al primer elemento. Las matrices multidimensionales se definen como "matriz de matrices..." y todas, excepto la dimensión más externa, deben tener un tamaño constante en tiempo de compilación:

int a [ 10 ][ 8 ]; // matriz de 10 elementos, cada uno del tipo 'matriz de 8 elementos int'  

Punteros

Cada tipo de datos Ttiene un puntero de tipo correspondiente aT . Un puntero es un tipo de datos que contiene la dirección de una ubicación de almacenamiento de una variable de un tipo particular. Se declaran con el *declarador de tipo asterisco ( ) después del tipo de almacenamiento básico y antes del nombre de la variable. Los espacios en blanco antes o después del asterisco son opcionales.

char * cuadrado ; long * círculo ; int * ovalado ;   

También se pueden declarar punteros para tipos de datos de puntero, creando así múltiples punteros indirectos, como char ** e int *** , incluidos punteros a tipos de matriz. Estos últimos son menos comunes que una matriz de punteros y su sintaxis puede resultar confusa:

char * pc [ 10 ]; // matriz de 10 elementos de 'puntero a char' char ( * pa )[ 10 ]; // puntero a una matriz de 10 elementos de char    

El elemento pcrequiere diez bloques de memoria del tamaño del puntero achar (normalmente 40 u 80 bytes en plataformas comunes), pero el elemento paes solo un puntero (tamaño 4 u 8 bytes), y los datos a los que hace referencia son una matriz de diez bytes ( ).sizeof *pa == 10

Sindicatos

Un tipo de unión es una construcción especial que permite el acceso al mismo bloque de memoria mediante la elección de distintas descripciones de tipo. Por ejemplo, se puede declarar una unión de tipos de datos para permitir la lectura de los mismos datos como un entero, un flotante o cualquier otro tipo declarado por el usuario:

unión { int i ; float f ; struct { unsigned int u ; double d ; } s ; } u ;         

El tamaño total de ues el tamaño de u.s– que resulta ser la suma de los tamaños de u.s.uy u.s.d– ya que ses mayor que ambos iy f. Al asignar algo a u.i, algunas partes de u.fpueden conservarse si u.ies menor que u.f.

Leer desde un miembro de la unión no es lo mismo que convertir, ya que el valor del miembro no se convierte, sino que simplemente se lee.

Punteros de función

Los punteros de función permiten hacer referencia a funciones con una firma particular. Por ejemplo, para almacenar la dirección de la función estándar absen la variable my_int_f:

int ( * my_int_f )( int ) = & abs ; // el operador & se puede omitir, pero deja en claro que aquí se usa la "dirección de" abs   

Los punteros de función se invocan por nombre, al igual que las llamadas a funciones normales. Los punteros de función son independientes de los punteros y de los punteros vacíos .

Calificadores de tipo

Los tipos antes mencionados se pueden caracterizar aún más mediante calificadores de tipo , lo que produce un tipo calificado . A partir de 2014 [actualizar]y C11 , hay cuatro calificadores de tipo en C estándar: const( C89 ), volatile( C89 ), restrict( C99 ) y _Atomic( C11 ) – este último tiene un nombre privado para evitar conflictos con los nombres de usuario, [14] pero atomicse puede usar el nombre más común si <stdatomic.h>se incluye el encabezado. De estos, constes de lejos el más conocido y el más utilizado, aparece en la biblioteca estándar y se encuentra en cualquier uso significativo del lenguaje C, que debe satisfacer la corrección constante . Los otros calificadores se utilizan para la programación de bajo nivel y, aunque se usan ampliamente allí, rara vez los usan los programadores típicos. [ cita requerida ]

Véase también

Referencias

  1. ^ Barr, Michael (2 de diciembre de 2007). «Enteros portátiles de ancho fijo en C» . Consultado el 18 de enero de 2016 .
  2. ^ ab Especificación ISO/IEC 9899:1999, TC3 (PDF) . p. 255, § 7.18 Tipos enteros <stdint.h> .
  3. ^ abcdefghij Especificación ISO/IEC 9899:1999, TC3 (PDF) . p. 22, § 5.2.4.2.1 Tamaños de tipos enteros <limits.h> .
  4. ^ Fundamento de la Norma Internacional — Lenguajes de Programación — C Revisión 5.10 (PDF) . p. 25, § 5.2.4.2.1 Tamaños de los tipos enteros <limits.h> .
  5. ^ Borrador de especificación ISO/IEC 9899:2023 (PDF) . p. 41, § 6.2.6 Representaciones de tipos .
  6. ^ "Límites de números enteros en C y C++". 21 de julio de 2023.
  7. ^ ab Especificación ISO/IEC 9899:1999, TC3 (PDF) . p. 37, § 6.2.6.1 Representaciones de tipos – General .
  8. ^ abcdef Especificación ISO/IEC 9899:1999, TC3 (PDF) . p. 56, § 6.4.4.1 Constantes enteras .
  9. ^ "Modelos de programación de 64 bits: ¿por qué LP64?". The Open Group . Consultado el 9 de noviembre de 2011 .
  10. ^ "Ancho de tipo (La biblioteca C de GNU)". www.gnu.org . Consultado el 30 de julio de 2022 .
  11. ^ "<limits.h>". pubs.opengroup.org . Consultado el 30 de julio de 2022 .
  12. ^ Especificación ISO/IEC 9899:1999, TC3 (PDF) . p. 67, § 6.5 Expresiones .
  13. ^ Borrador de especificación ISO/IEC 9899:2023 (PDF) . p. 37, § 6.2.5 Tipos .
  14. ^ C11: El nuevo estándar C, Thomas Plum
Obtenido de "https://es.wikipedia.org/w/index.php?title=Tipos_de_datos_C&oldid=1246026447"