Vés al contingut

Tipus de dades C

De la Viquipèdia, l'enciclopèdia lliure
Tipus de dades C

Característiques tècniques
PlataformaC standard library

En el llenguatge de programació C, els tipus de dades constitueixen la semàntica i les característiques d'emmagatzematge dels elements de dades. S'expressen en la sintaxi del llenguatge en forma de declaracions per a ubicacions de memòria o variables. Els tipus de dades també determinen els tipus d'operacions o mètodes de tractament dels elements de dades.

El llenguatge C proporciona tipus aritmètics bàsics, com ara tipus de nombres enters i reals, i sintaxi per crear tipus de matrius i compostos. Les capçaleres de la biblioteca estàndard C, que s'utilitzaran mitjançant les directives d'inclusió, contenen definicions de tipus de suport, que tenen propietats addicionals, com ara proporcionar emmagatzematge amb una mida exacta, independentment de la implementació del llenguatge en plataformes de maquinari específiques.[1][2]

Tipus bàsics

[modifica]

Tipus principals

[modifica]

El llenguatge C proporciona els quatre especificadors bàsics de tipus aritmètic char, int, float i double, i els modificadors signed, unsigned, short i long. La taula següent enumera les combinacions permeses per especificar un gran conjunt de declaracions específiques de mida d'emmagatzematge.

Tipus Explicació Tamany mínim (bits) Format
char La unitat adreçable més petita de la màquina que pot contenir un conjunt de caràcters bàsic. És un tipus enter. El tipus real pot estar signat o sense signar. Conté CHAR_BIT bits.[3] 8 %c
signed char De la mateixa mida que el char, però garantit que està signat. Capaç de contenir almenys l'interval [−127, +127].[3] 8 %c (o %hhi per a la sortida numèrica )
unsigned char De la mateixa mida que char, però garantit que no està signat. Conté almenys l'interval [0, 255].[4] 8 %c (o %hhu per a la sortida numèrica)
  • short

  • short int

  • signed short

  • signed short int

Tipus d'enter amb signe curt. Capaç de contenir almenys l'interval [−32.767, +32.767].[3] 16 %hi o %hd
  • unsigned short

  • unsigned short int

Tipus d'enter curt sense signe. Conté almenys l'interval [0, 65.535].[3] 16 %hu
  • int

  • signed

  • signed int

Tipus d'enter amb signe bàsic. Capaç de contenir almenys l'interval [−32.767, +32.767].[3] 16 %i o %d
  • unsigned

  • unsigned int

Tipus d'enter bàsic sense signe. Conté almenys l'interval [0, 65.535].[3] 16 %u
  • long

  • long int

  • signed long

  • signed long int

Tipus d'enter amb signe llarg. Capaç de contenir almenys el rang [−2.147.483.647, +2.147.483.647].[3] 32 %li o %ld
  • unsigned long

  • unsigned long int

Tipus d'enter llarg sense signe. Capaç de contenir almenys el rang [0, 4.294.967.295].[3] 32 %lu
  • long long

  • long long int

  • signed long long

  • signed long long int

Tipus d'enter llarg amb signe llarg. Capaç de contenir almenys el rang [−9.223.372.036.854.775.807, +9.223.372.036.854.775.807].[3] Especificat des de la versió C99 de l'estàndard. 64 %lli o %lld
  • unsigned long long

  • unsigned long long int

Tipus d'enter llarg sense signe. Conté almenys l'interval [0, 18.446.744.073.709.551.615].[3] Especificat des de la versió C99 de l'estàndard. 64 %llu
float Tipus de coma flotant real, normalment conegut com a tipus de coma flotant de precisió única. Propietats reals no especificades (excepte límits mínims); tanmateix, a la majoria de sistemes, aquest és el format de coma flotant binari de precisió única IEEE 754 (32 bits). Aquest format és requerit per l'annex F opcional "IEC 60559 aritmètica de coma flotant". Conversió del text :
  • %f %F
  • %g %G
  • %e %E
  • %a %A
double Tipus de coma flotant real, normalment conegut com a tipus de coma flotant de doble precisió. Propietats reals no especificades (excepte límits mínims); tanmateix, a la majoria de sistemes, aquest és el format de coma flotant binari de doble precisió IEEE 754 (64 bits). Aquest format és requerit per l'annex F opcional "IEC 60559 aritmètica de coma flotant". %Lf %LF

%Lg %LG

%Le %LE

%La %LA

long double Tipus real de coma flotant, normalment assignat a un format de nombre de coma flotant de precisió ampliada. Propietats actuals sense especificar. Pot ser format de punt flotant de precisió ampliada x86 (80 bits, però normalment 96 bits o 128 bits de memòria amb bytes de farciment), el "doble-doble" no IEEE (128 bits), IEEE 754 de precisió quàdruple flotant -Format de punt (128 bits), o el mateix que doble. Consulteu l'article sobre el doble llarg per a més detalls. %Lf %LF

%Lg %LG

%Le %LE

%La %LA

Estructures

[modifica]

Les estructures agreguen l'emmagatzematge de múltiples elements de dades, de tipus de dades potencialment diferents, en un bloc de memòria referenciat per una sola variable. L'exemple següent declara el tipus de dades struct birthday que conté el nom i l'aniversari d'una persona. La definició de l'estructura va seguida d'una declaració de la variable John que assigna l'emmagatzematge necessari.

struct birthday {
	char name[20];
	int day;
	int month;
	int year;
};

struct birthday John;

La disposició de memòria d'una estructura és un problema d'implementació del llenguatge per a cada plataforma, amb algunes restriccions. L'adreça de memòria del primer membre ha de ser la mateixa que l'adreça de la pròpia estructura. Les estructures es poden inicialitzar o assignar a l'ús de literals compostos. Una funció pot retornar directament una estructura, encara que això sovint no és eficient en temps d'execució. Des de C99, una estructura també pot acabar amb un membre de matriu flexible.

Matrius

[modifica]

Per a cada tipus T, excepte els tipus void i function, existeixen els tipus "matriu de N elements de tipus T ". Una matriu és una col·lecció de valors, tots del mateix tipus, emmagatzemats de manera contigu a la memòria. Una matriu de mida N està indexada per nombres enters des de 0 fins a N −1 inclòs. Aquí teniu un breu exemple:

int cat[10]; // array of 10 elements, each of type int

Les matrius es poden inicialitzar amb un inicialitzador compost, però no s'assignen. Les matrius es passen a les funcions passant un punter al primer element. Les matrius multidimensionals es defineixen com a "matriu de matriu..." i totes, excepte la dimensió més externa, han de tenir una mida constant en temps de compilació:

int a[10][8]; // array of 10 elements, each of type 'array of 8 int elements'

Punters

[modifica]

Cada tipus de dades T té un punter de tipus corresponent a T. Un punter és un tipus de dades que conté l'adreça d'una ubicació d'emmagatzematge d'una variable d'un tipus determinat. Es declaren amb el declarador de tipus asterisc (* ) després del tipus d'emmagatzematge bàsic i abans del nom de la variable. Els espais en blanc abans o després de l'asterisc són opcionals.

char *square;
long *circle;
int *oval;

També es poden declarar punters per a tipus de dades de punter, creant així diversos punters indirectes, com arachar ** iint ***, inclosos els punters a tipus de matriu. Aquests últims són menys comuns que una matriu de punters, i la seva sintaxi pot ser confusa:

char *pc[10]; // array of 10 elements of 'pointer to char'
char (*pa)[10]; // pointer to a 10-element array of char

Punters a funció

[modifica]

Els punters de funció permeten fer referència a funcions amb una signatura determinada. Per exemple, per emmagatzemar l'adreça de la funció estàndard abs a la variable my_int_f :

int (*my_int_f)(int) = &abs;
// the & operator can be omitted, but makes clear that the "address of" abs is used here

Els punters de funció s'invoquen pel nom igual que les trucades de funcions normals. Els punters de funció estan separats dels punters i dels punters buits.

Referències

[modifica]
  1. Barr, Michael. «Portable Fixed-Width Integers in C» (en anglès), 02-12-2007. [Consulta: 18 gener 2016].
  2. ISO/IEC 9899:1999 specification, TC3 (en anglès). 
  3. 3,00 3,01 3,02 3,03 3,04 3,05 3,06 3,07 3,08 3,09 ISO/IEC 9899:1999 specification, TC3 (en anglès). 
  4. ISO/IEC 9899:1999 specification, TC3 (en anglès).