2012-05-01 9 views
8

¿Cuál es la contraparte sin firma de ptrdiff_t? Y del mismo modo: ¿cuál es la contraparte firmada de size_t?¿Cuál es la contraparte sin firma de ptrdiff_t?

Lo que estoy tratando de lograr es tener un tipo sin signo que pueda usar para almacenar los valores positivos de la variable ptrdiff_t sin preocuparse por valores grandes, esto parece ser size_t.

A la inversa: me gustaría tener un tipo firmado que pueda almacenar los valores de size_t, de nuevo sin preocuparse por valores grandes.

+0

Hay 'intptr_t' Eche un vistazo a http://stackoverflow.com/questions/1464174/size-t-vs-intptr-t – IronMensan

+0

@IronMensan ¡Seguramente quiere decir' uintptr_t'! (u para unsigned) –

+0

¿Ha considerado mirar el estándar? –

Respuesta

8

No creo que exista una contraparte formal sin firmar ptrdiff_t (no uptrdiff_t), pero utilizar size_t es bastante razonable.

En POSIX, la contraparte firmada de size_t es ssize_t. Es el tipo devuelto por funciones tales como read(), por ejemplo.

Eso sugiere que habrá pocas implementaciones donde el tipo subyacente de ssize_t y ptrdiff_t será diferente.

4

size_t se utiliza para representar el tamaño de los objetos. Se creía ampliamente que los escritores de compiladores no crearán objetos con tamaños negativos.

Tenga en cuenta que con ptrdiff_t` se obtiene la diferencia dependiendo de cómo se está comparando, por lo que un tipo con signo tiene sentido (cambiando a un tipo sin signo de los valores razonables es trivial):

5.7 operadores aditivos

[...] al igual que con cualquier otro desbordamiento aritmético, si el resultado no encaja en el espacio proporcionado, el comportamiento es indefinido. [...]

Por lo tanto, es posible que necesite crear un tipo especial para 'valores muy grandes'.

+0

Al leer su respuesta, supongo que 'ssize_t' no existe. – mfontanini

+1

@fontanini: en el estándar C, no hay ningún tipo 'ssize_t'; esa es una extensión POSIX al estándar C. –

+0

Vaya, pensé que era una definición estándar. Mi mal: D – mfontanini

Cuestiones relacionadas