¿Diferencia entre size_t y unsigned int?

107

Estoy tan confundido size_t. He buscado en Internet y en todas partes mencioné que size_tes un tipo sin firmar, por lo que solo puede representar valores no negativos.

Mi primera pregunta es: si se usa para representar solo valores no negativos, ¿por qué no lo usamos en unsigned intlugar de size_t?

La segunda pregunta es: ¿ size_ty unsigned intintercambiables o no? Si no es así, ¿por qué?

¿Y alguien puede darme un buen ejemplo size_ty brevemente de su funcionamiento?

Vikas Verma
fuente
5
typedef /*This part is implementation dependent */ size_t;
P0W
5
posible duplicado de int sin firmar frente a size_t

Respuestas:

87

si se usa para representar un valor no negativo, entonces, ¿por qué no usamos en unsigned intlugar desize_t

Porque unsigned intno es el único tipo de entero sin signo. size_tpodría ser cualquiera de unsigned char, unsigned short, unsigned int, unsigned longo unsigned long long, dependiendo de la aplicación.

La segunda pregunta es esa size_ty unsigned intson intercambiables o no y si no, ¿por qué?

No son intercambiables, por el motivo explicado 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 trabajo". Funciona como cualquier otro tipo sin firmar (en particular, como el tipo al que está escrito). Se le anima a usar size_tcuando describa el tamaño de un objeto. En particular, el sizeofoperador y varias funciones de biblioteca estándar, como strlen()return size_t.

Bono: aquí hay un buen artículo sobre size_t(y el ptrdiff_ttipo más relacionado ). Razona muy bien por qué debería usarlo.

Santhosh Kumar
fuente
1
¿Cómo exactamente puede size_tser un unsigned char? ¿Está esto en el estándar que está permitido? Quiero decir, con esa idea, ¿cómo se puede esperar que alguien use calloc()(y una familia), strlen()etc.? Eso me parece absurdo.
Pryftan
Creo que size_testá definido en el estándar como un "tipo entero sin signo", pero no requiere que sea igual a cualquiera de unsigned {char, short, int, long, long long}.
Paul Hankin
80

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_tes un typedef(es decir, un alias) para algún tipo sin signo (probablemente uno de los anteriores, pero posiblemente un tipo entero sin signo extendido , aunque eso es poco probable). Es el tipo cedido por elsizeof operador.

En un sistema, podría tener sentido usarlo unsigned intpara representar tamaños; en otro, podría tener más sentido usar unsigned longo unsigned long long. ( size_tes poco probable que sea unsigned charo unsigned short, pero está permitido).

El propósito de size_tes aliviar al programador de tener que preocuparse por qué de los tipos predefinidos se usa para representar tamaños.

Código que asume sizeofrendimientos unsigned inty no sería portátil. size_tEs más probable que el código que asume que produce una sea ​​portátil.

Keith Thompson
fuente
6
Creo que esta debería ser la respuesta aceptada porque explica por qué debería usar size_t
kuchi
@ Keith-Thompson para significa esto que el tipo específico (es decir unsigned int, unsigned long, etc.) que size_tcorresponde a depende de la máquina en la que se ejecuta el código? es decir, en una arquitectura de máquina, corresponde unsigned intpero en otra arquitectura corresponderá unsigned long, etc.
Richie Thomas
1
@RichieThomas: Depende de la implementación de C. Dos compiladores diferentes en la misma arquitectura pueden elegir diferentes tipos size_t, especialmente si, por ejemplo, unsigned longy unsigned long longtienen el mismo tamaño.
Keith Thompson
@RichieThomas Eso también forma parte. Es decir, el máximo de long, long longetc. depende del sistema: si le echas un vistazo limits.h, al menos en Unices verás que el valor máximo de ints depende del tamaño de palabra del sistema.
Pryftan
1
@Pryftan Eche un vistazo a la serie Motorola 68000, también a la anterior serie Intel x86 (que se remonta a los 8086 y 8088).
Keith Thompson
10

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 intporque el tamaño de intlo especifica el modelo de datos. Por ejemplo, LLP64 usa 32 bits inte ILP64 usa 64 bits int.

DrYap
fuente
5
¿De dónde es esa cita? (No es del estándar C.)
Keith Thompson
2
La pregunta está etiquetada c . El estándar C ++ no tiene relación con C.
IInspectable
7

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 la implementación de C particular pueda crear. Este tipo de datos puede ser más pequeño (en número de bits), más grande o exactamente igual que unsigned int.

Thomas Padron-McCarthy
fuente
4

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

Ed Heal
fuente
Buen punto. An applees una manzana , a size_tes un tamaño ...
dom_beau
2

size_t type es un tipo de entero sin signo base 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 sistema de 32 bits, size_t tomará 32 bits, en uno de 64 bits, 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 bucles, indexación de matrices y aritmética de direcciones. El valor máximo posible del tipo size_t es constante SIZE_MAX.

usuario2873459
fuente
1
size_tpuede almacenar el tamaño de cualquier objeto. Un puntero puede apuntar a cualquier byte de cualquier objeto. Puede tener un sistema con, por ejemplo, un espacio de direcciones de 64 bits que limita el tamaño de cualquier objeto a 2 ** 32-1 bytes. No hay garantía de que size_ty uintptr_tsean del mismo tipo.
Keith Thompson
1

En palabras simples, size_t depende de la plataforma y de la implementación, mientras que unsigned int solo depende de la plataforma.

Kaushal Billore
fuente