¿Se definen tipos como uint32, int32, uint64, int64 en cualquier encabezado stdlib?

94

A menudo veo código fuente usando tipos como uint32, uint64 y me pregunto si el programador debería definirlos en el código de la aplicación o si están definidos en un encabezado lib estándar.

¿Cuál es la mejor manera de tener estos tipos en el código fuente de mi aplicación?

Philix
fuente

Respuestas:

135

El C99 stdint.hdefine estos:

  • int8_t
  • int16_t
  • int32_t
  • uint8_t
  • uint16_t
  • uint32_t

Y, si la arquitectura los admite:

  • int64_t
  • uint64_t

También hay otras definiciones de tipos enteros stdint.h.

Si está atascado sin un entorno C99, probablemente debería proporcionar sus propias definiciones de tipo y usar las C99 de todos modos.

Los uint32y uint64(es decir, sin el _tsufijo) son probablemente específicos de la aplicación.

mu es demasiado corto
fuente
16
Esta respuesta es incorrecta. Todo lo anterior solo está disponible si existe un tipo de ancho exacto de ese tamaño (sin relleno) en la implementación. Sin embargo, aunque no sea así, los tipos int_leastNN_ty uint_leastNN_tpara NN8, 16, 32 y 64 siempre deben existir . C99 no permite implementaciones sin un tipo entero de al menos 64 bits, ya que long longse requiere que sea al menos así de grande.
R .. GitHub DEJA DE AYUDAR A ICE
@R ..: ¿Sería correcto decir "POSIX stdint.h" en lugar de "C99 stdint.h"?
mu es demasiado corto
1
POSIX los stdint.hrequiere todos.
R .. GitHub DEJA DE AYUDAR A ICE
1
@R .., ¿Puedes editar esta respuesta para que sea correcta? Me tomó un poco analizar la combinación de contenido actual y sus comentarios.
merlin2011
SDL define alias como alias typedef uint32_t Uint32;en include / SDL_stdinc.h (si es usuario de SDL)
Et7f3XIV
10

Todos esos tipos de enteros están definidos en stdint.h

GWW
fuente
¿No es una stdint.himplementación específica? Vea también esta pregunta y esta pregunta
Chris Frederick
3
Mirando el archivo encontré "ISO C99: 7.18 tipos de enteros <stdint.h>" en los comentarios. Supongo que lo conseguirás stdint.hsi respetas el estándar C99.
philix
No encuentro a ninguno de ellos stdint.h. Esto devuelve 0 hits: grep uint32 /usr/lib/gcc/x86_64-linux-gnu/4.9/include/stdint.h | grep -v uint32_t.
jww
1
@jww: En mi caso, ese archivo contiene #include "stdint-gcc.h", y grepping ese archivo produce las definiciones.
Victor Zamanian
1
@jww sí, no existen. Los únicos que son estándar y que deben definirse son los que tienen el _tsufijo, como se enumera en la respuesta anterior.
Victor Zamanian
2

Si está utilizando C99 solo incluya stdint.h. Por cierto, los tipos de 64 bits están ahí si el procesador los admite.

BiGYaN
fuente
Por favor, cite algo al respecto.
BiGYaN
6
x86 no admite matemáticas de 64 bits, pero tiene tipos de 64 bits.
R .. GitHub DEJA AYUDAR A ICE
2
Si lo hace. Admite 32 bits x 32 bits -> multiplicación de 64 bits, 64 bits / 32 bits -> cociente de 32 bits y división de resto de 32 bits, además de tener instrucciones de sumar con acarreo y restar con préstamo. Fue construido para poder realizar aritmética de 64 bits, aunque solo sea porque el 8086 necesitaba poder hacer aritmética de 32 bits.
Michael Morris
También hay un uint128_tif __SIZEOF_INT128__definido como 16 o mayor (GCC y compatibles). Está disponible en máquinas x86_64 / amd64, pero el procesador no lo admite de forma nativa. Solo los Cray tienen ese tamaño de registro, IIRC.
jww
0

El interrogador en realidad preguntó sobre int16 (etc.) en lugar de (feo) int16_t (etc.).

No hay encabezados estándar, ni ninguno en la carpeta / usr / include / de Linux que los defina sin "_t".

Steve
fuente