2010-03-07 10 views
18
  • Ya no es el tipo entero más grande ahora que hay "mucho tiempo".
  • No es un tipo de ancho fijo: tiene 32 bits en algunas plataformas y 64 en otras.
  • No es necesariamente el mismo tamaño que un puntero (por ejemplo, en Windows de 64 bits)

Por lo tanto, lo hace "largo" tienen un significado más? ¿Hay alguna vez una razón para declarar un long en lugar de un ptrdiff_t o int64_t?¿Es "largo" todavía útil en C?

Respuesta

5

Hay una diferencia sutil entre still useful y something you should habitually use. El tipo long aún prospera, como Chris Lutz noted detrás de muchos tipos específicos del sistema y la plataforma (aunque, por lo general, como unsigned).

Cuando sabe los datos que va a trabajar con siempre va a encajar en ese tipo (agradablemente, mejor si también sabe el signo numérico), no hay ninguna razón en particular no usarlo, especialmente si tiene espacio limitado en una estructura para trabajar.

Sin embargo, en la mayoría de los casos, por el bien de los futuros mantenedores, es mucho mejor usar intxx_t o uintxx_t siempre que sea posible. Por ejemplo, usted no sabe sabe que una fecha de época UNIX siempre cabe dentro de un largo sin firmar en plataformas de 32 bits (por lo tanto, time_t), a menos que tenga la buena autoridad de que el mundo terminará antes de que se transfiera :)

+4

Muy bien, cue los chistes de 2012 ... –

+2

Yo diría que a menos que tengas una razón específica para necesitar * exactamente * XX bits, no deberías usar 'intXX_t'. Por lo general, realmente necesita * al menos * XX bits, en cuyo caso puede simplemente usar 'int' para X <= 16; 'long' para 16 caf

+1

@caf: Imposible discutir eso. Sin embargo, gran parte del código que escribo está escrito con la idea de que cierto miembro nunca 'será más grande que' cierto tipo, cuando en realidad todo comienza mucho más pequeño de lo que realmente he planeado. A menudo es el caso cuando tienes que mantener los resultados de la consulta, tabular conjuntos de cosas que otras cosas crujieron, etc. Creo que soy más defensivo que eficiente, pero no tengo opción la mayoría del tiempo :) –

17

¿Alguna vez hay una razón para declarar un long en lugar de un ptrdiff_t o int64_t?

Nunca hubo en esos casos. Si desea una diferencia de puntero, o un valor específico de 64 bits, debe utilizar ptrdiff_t o int64_t. Nunca debiste haber estado usando long en primer lugar, excepto tal vez detrás de una plataforma dependiente de la plataforma typedef.

Debe usar long cuando necesite al menos un entero de 32 bits, porque int solo garantiza que tenga al menos 16 bits. Si necesita un tipo nativo, pero necesita al menos 32 bits, use long. Si la limitación de 16 bits es aceptable en algunas plataformas antiguas (que probablemente no importe y tu código probablemente no se compilará para siempre), entonces no importa en particular.

+1

+1 para al menos una idea entera de cierto tamaño. –

+4

Debo señalar que ese requisito también puede satisfacerse con los tipos 'int_leastX_t' de C99, pero con menos fiabilidad, ya que pocos compiladores son compatibles con C99. –

Cuestiones relacionadas