Diferencia entre size_t y unsigned int?
(6)
si se usa para representar un valor no negativo, entonces, ¿por qué no usamos
unsigned int
vez desize_t
Porque unsigned int
no es el único tipo integral sin signo. size_t
podría ser cualquiera de caracteres unsigned char
, unsigned short
, unsigned int
, unsigned long
o unsigned long long
, dependiendo de la implementación.
La segunda pregunta es que size_t y unsinged 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 por "su breve trabajo". Funciona como cualquier otro tipo sin signo (en particular, como el tipo al que se le ha añadido el tipo). Se le recomienda usar size_t
cuando describa el tamaño de un objeto. En particular, el operador sizeof
y varias funciones de biblioteca estándar, como strlen()
, devuelven size_t
.
Bono: aquí hay un buen artículo (artículo borrado, use la instantánea de la máquina de retorno ) sobre size_t
(y el tipo ptrdiff_t
estrechamente relacionado). Motiva muy bien por qué deberías usarlo.
Estoy tan confundido sobre size_t
. He buscado en Internet y en todas partes se menciona que size_t
es un tipo sin signo, por lo que puede representar un valor no negativo.
Mi primera pregunta es que si se usa para representar valores no negativos, ¿por qué no usamos unsigned int
vez de size_t
?
Mi segunda pregunta es: ¿ size_t
y unsigned int
intercambiables o no? Si no, ¿por qué?
¿Y alguien puede darme un buen ejemplo de size_t
y su breve funcionamiento?
Además de las otras respuestas, también documenta el código y le dice a la gente que estás hablando sobre el tamaño de los objetos en la memoria
El tipo size_t es un tipo base entero sin signo del lenguaje C / C ++. Es el tipo de resultado devuelto por el operador sizeof. El tamaño del tipo se elige para que pueda almacenar el tamaño máximo de una matriz teóricamente posible de cualquier tipo. En un tamaño de sistema de 32 bits, tomará 32 bits, en uno de 64 bits y 64 bits. En otras palabras, una variable de tipo size_t puede almacenar un puntero de forma segura. La excepción es punteros a funciones de clase, pero este es un caso especial. Aunque size_t puede almacenar un puntero, es mejor usar otro tipo de entero sin signo uintptr_t para ese propósito (su nombre refleja su capacidad). Los tipos size_t y uintptr_t son sinónimos. El tipo size_t se usa generalmente para contadores de bucles, indexación de matrices y aritmética de direcciones. El valor máximo posible del tipo size_t es constante SIZE_MAX.
Hay 5 tipos de entero estándar sin signo 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 un tipo sin firmar, (probablemente uno de los anteriores pero posiblemente un tipo de entero extendido sin signo , aunque eso es poco probable). Es el tipo cedido por el operador sizeof
.
En un sistema, podría tener sentido usar unsigned int
para representar tamaños; en otro, podría tener más sentido usar un unsigned long
unsigned long long
o un unsigned long long
. ( size_t
es poco probable que sea unsigned char
unsigned short
o unsigned short
, pero eso está permitido).
El objetivo de size_t
es size_t
que el programador tenga que preocuparse por cuál de los tipos predefinidos se usa para representar tamaños.
El código que supone que sizeof
produce una unsigned int
no sería portátil. El código que asume que arroja un size_t
es más probable que sea portátil.
size_t se usa para almacenar tamaños de objetos de datos, y se garantiza que pueda contener el tamaño de cualquier objeto de datos que pueda crear la implementación de C en particular. Este tipo de datos puede ser más pequeño (en número de bits), más grande o exactamente igual que unsigned int.
size_t
tiene una restricción específica.
Citando de http://www.cplusplus.com/reference/cstring/size_t/ :
Alias de uno de los tipos de 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 recuentos.
No es intercambiable con unsigned int
porque el tamaño de int
está especificado por el modelo de datos. Por ejemplo, LLP64 utiliza un int
32 bits e ILP64 utiliza un int
64 bits.