# Tipus de dades C

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.

## Tipus bàsics
### Tipus principals

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. | 8 | %c |
| signed char | De la mateixa mida que el char, però garantit que està signat. Capaç de contenir almenys l'interval [−127, +127]. | 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]. | 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]. | 16 | %hi o %hd |
| unsigned short unsigned short int | Tipus d'enter curt sense signe. Conté almenys l'interval [0, 65.535]. | 16 | %hu |
| int signed signed int | Tipus d'enter amb signe bàsic. Capaç de contenir almenys l'interval [−32.767, +32.767]. | 16 | %i o %d |
| unsigned unsigned int | Tipus d'enter bàsic sense signe. Conté almenys l'interval [0, 65.535]. | 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]. | 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]. | 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]. 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]. 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

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

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:
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ó:

### Punters

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

### Punters a funció

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 :
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

* ↑ Barr, Michael. «Portable Fixed-Width Integers in C» (en anglès), 02-12-2007. [Consulta: 18 gener 2016].
* ↑ ISO/IEC 9899:1999 specification, TC3 (en anglès).
* 1 2 3 4 5 6 7 8 9 10 ISO/IEC 9899:1999 specification, TC3 (en anglès).
* ↑ ISO/IEC 9899:1999 specification, TC3 (en anglès).