¿Diferencia entre size_t y unsigned int?

Estoy tan confundido acerca de size_t . He buscado en Internet y en todas partes mencioné que size_t es un tipo sin firma, 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 lugar de size_t ?

Mi segunda pregunta es: ¿son size_t y unsigned int intercambiables o no? Si no es así, ¿por qué?

¿Y alguien puede darme un buen ejemplo de size_t y su breve trabajo?

Si se usa para representar un valor no negativo, ¿por qué no usamos unsigned int lugar de size_t

Porque unsigned int no es el único tipo integral sin signo. size_t puede ser cualquiera de caracteres unsigned char , unsigned short , unsigned int , unsigned long o unsigned long long , según 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 trabajo?

No entiendo lo que quiere decir con “su breve trabajo”. Funciona como cualquier otro tipo sin firma (en particular, como el tipo al que está tipificado). Se recomienda que use size_t cuando esté describiendo 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 eliminado, use una copia de seguridad de la máquina wayback ) sobre size_t (y el tipo ptrdiff_t estrechamente relacionado). Razona muy bien por qué debes 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 signo, (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 operador sizeof .

En un sistema, podría tener sentido utilizar unsigned int para representar tamaños; en otro, podría tener más sentido usar unsigned long o unsigned long long . (Es poco probable que size_t sea unsigned char o unsigned short , pero eso está permitido).

El propósito de size_t es size_t que el progtwigdor tenga que preocuparse por cuál de los tipos predefinidos se usa para representar tamaños.

El código que asume que sizeof produce un unsigned int no sería portátil. El 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.

Cotizando desde 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 modelo de datos especifica el tamaño de int . Por ejemplo, LLP64 usa un int 32 bits e ILP64 usa un int 64 bits.

size_t se utiliza para almacenar tamaños de objetos de datos, y se garantiza que puede 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 int sin signo.

size_t type es un tipo entero sin signo base de lenguaje C / C ++. Es el tipo de resultado que devuelve el operador sizeof. El tamaño del tipo se elige de modo que pueda almacenar el tamaño máximo de una matriz teóricamente posible de cualquier tipo. En un sistema de 32 bits, size_t tomará 32 bits, en 64 bits uno 64 bits. En otras palabras, una variable de tipo size_t puede almacenar un puntero de forma segura. La excepción son los punteros a las 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 bucle, indexación de matrices y aritmética de direcciones. El valor máximo posible del tipo size_t es la constante SIZE_MAX.

Además de las otras respuestas, también documenta el código y le dice a la gente que está hablando sobre el tamaño de los objetos en la memoria.