Antes que nada, debe verificar el tamaño real de los dos tipos. Algo así como el siguiente fragmento debe hacer:
#include <stdio.h>
#include <unistd.h>
int main() {
printf("sizeof( size_t) = %d bytes\n",(int) sizeof(size_t));
printf("sizeof(ssize_t) = %d bytes\n",(int) sizeof(ssize_t));
return 0;
}
consigo (Linux de 64 bits, GCC v7.2) "8 bytes" en ambos casos, lo que es lo mismo, siempre y long int int y largo, la CPU máximo -nombre entero nativo
Cuando los tamaños son los mismos (y siempre deberían), size_t puede tener "2x valores absolutos más grandes" que ssize_t que, a su vez, puede tener valores firmados (que sean positivos o negativos).
Si fueran diferentes, el más grande sería ... más grande y podría acomodar valores más grandes.
Pero al final, ssize_t y size_t son dos tipos diferentes utilizados para "hablar" sobre tamaños, longitudes, cantidades de memoria, etc.
El primero solo está abandonando 1 bit por el valor para obtener el signo necesario para señalar algún tipo de error.
Finalmente, los dos tipos no son intercambiables, al menos no siempre. Cuando el tamaño puede pasar de 2^63 bytes/artículos, la diferencia es clara. size_t no se desbordará mientras que ssize_t lo hará.
En circunstancias "normales" puede transmitir de uno a otro. Para los casos que mencioné anteriormente, nunca debes mezclarlos.
Solo como referencia, strlen() y malloc() usan size_t, mientras que read() y readv() usan ssize_t.
Por lo tanto, ssize_t NO es la versión firmada de size_t ya que tienen reinos no superpuestos.
Luego, para sus preguntas, los dos números que ve difieren en 5 unidades, eso es exactamente lo que usted espera. Lo que ves es el valor de estas dos variables cuando se ve como "sin signo largo". Intente imprimirlos como "firmado largo" (% ld) en su lugar.
Está utilizando el especificador de formato incorrecto. – Mysticial
'ssize_t' no está en el estándar C, proviene de POSIX. El cierre en el estándar C que viene a 'ssize_t' es' ptrdiff_t'. –
'size_t' es un tipo integral sin signo, pero por lo general no es' unsigned int'. Normalmente es equivalente a 'unsigned long' o' unsigned long long'. –