Abraham, parte de nuestro staff, nos hizo el favor de redactar este post porque controla perfectamente dicho tema.
Solución:
si se usa para representar un valor no negativo, ¿por qué no lo usamos?
unsigned int
en vez desize_t
Porque unsigned int
no es el único tipo entero sin signo. size_t
podría ser cualquiera de unsigned char
, unsigned short
, unsigned int
, unsigned long
o unsigned long long
, dependiendo de la implementación.
La segunda pregunta es que
size_t
yunsigned int
son intercambiables o no y si no, ¿por qué?
No son intercambiables, por la razón explicada anteriormente. ^^
.
¿Y alguien puede darme un buen ejemplo de size_t y su breve funcionamiento?
No entiendo muy bien lo que quieres decir con “su breve funcionamiento”. Funciona como cualquier otro tipo sin firmar (en particular, como el tipo al que está definido). Se le anima a utilizar size_t
cuando estás describiendo el tamaño de un objeto. En particular, el sizeof
operador y varias funciones de biblioteca estándar, como strlen()
, regreso size_t
.
Bonificación: aquí hay un buen artículo sobre size_t
(y los estrechamente relacionados ptrdiff_t
escribe). Razona muy bien por qué debería usarlo.
Hay 5 tipos de enteros sin signo estándar en C:
unsigned char
unsigned short
unsigned int
unsigned long
unsigned long long
con varios requisitos para sus tamaños y rangos (brevemente, el rango de cada tipo es un subconjunto del rango del siguiente tipo, pero algunos de ellos pueden tener el mismo rango).
size_t
es un typedef
(es decir, un alias) para algún tipo sin firmar, (probablemente uno de los anteriores, pero posiblemente un tipo de entero sin signo extendido, aunque eso es poco probable). Es el tipo producido por el sizeof
operador.
En un sistema, podría tener sentido usar unsigned int
para representar tamaños; en otro, podría tener más sentido usar unsigned long
o unsigned long long
. (size_t
es poco probable que sea cualquiera unsigned char
o unsigned short
, pero eso está permitido).
El propósito de size_t
es aliviar al programador de tener que preocuparse por cual de los tipos predefinidos se utiliza para representar tamaños.
Código que asume sizeof
produce un unsigned int
no sería portátil. Código que asume que produce un size_t
es más probable que sea portátil.
size_t
tiene una restricción específica.
Citando de http://www.cplusplus.com/reference/cstring/size_t/ :
Alias de uno de los tipos enteros sin signo fundamentales.
Es un tipo capaz de representar el tamaño de cualquier objeto en bytes.: size_t es el tipo devuelto por el operador sizeof y se usa ampliamente en la biblioteca estándar para representar tamaños y conteos.
No es intercambiable con unsigned int
porque el tamaño de int
es especificado por el modelo de datos. Por ejemplo, LLP64 utiliza una de 32 bits int
e ILP64 utiliza una de 64 bits int
.
Si guardas alguna vacilación o disposición de innovar nuestro división puedes escribir una explicación y con deseo lo interpretaremos.