2011-04-15 23 views
37

¿Hay alguna diferencia entre uint y unsigned int? Estoy buscando en el sitio, pero todas las preguntas se refieren a C# o C++. Me gustaría obtener una respuesta sobre C.Diferencia entre uint y unsigned int?

Tenga en cuenta que estoy usando GCC en Linux.

Respuesta

53

uint no es un tipo estándar - unsigned int es.

+7

y ¿qué implica este hecho? –

+8

@the_candyman: Que su gcc puede tener 'uint', o puede pasar que no lo tenga. It * will * have 'unsigned int' – Erik

+10

Ese código escrito con' uint' no será inherentemente portable a menos que 'uint' sea' typedef' que usted declare realmente dentro de ese código. – Jack

30

Algunos sistemas pueden definir uint como typedef.

typedef unsigned int uint;

Para estos sistemas son iguales. Pero uint no es un tipo estándar, por lo que cada sistema puede no ser compatible y, por lo tanto, no es portátil.

+2

Cabe destacar que si realmente desea una int sin firmar de un tamaño particular, entonces use 'uintXX_t'. –

+3

@Blagovest: los tipos 'uintXX_t' solo se definen en una implementación específica de C99 si tiene sentido tenerlos. 'uint_leastXX_t' se define en todas las implementaciones C99. Y estos tipos no existían en la versión anterior del estándar (no todos los compiladores de C actuales son compiladores C99). – pmg

7

El unsigned int una construida en (estándar) tipo por lo que si usted quiere que su proyecto sea multiplataforma, utilice siempre unsigned int ya que está garantizado para ser apoyado por todos los compiladores (siendo, por tanto, la norma ).

14

les extiendo un poco respuestas por Erik, Teoman Soygul y taskinoor

uint no es una norma.

Por tanto, poner su propia forma abreviada como esto se desanima:

typedef unsigned int uint;

Si nos fijamos para la especificidad plataforma en su lugar (por ejemplo, es necesario que especifique el número de bits de su int ocupan), incluyendo stdint.h:

#include <stdint.h> 

expondrá las siguientes categorías estándar de números enteros:

  • tipos número entero que tiene ciertas anchuras exactas

  • tipos número entero que tiene al menos ciertas anchuras especificadas

  • tipos enteros más rápidos que tiene al menos ciertas anchuras especificadas

  • tipos Integer suficientemente ancha para contener punteros a los objetos

  • Tipos enteros con el mayor ancho

Por ejemplo,

tipos enteros exacta de ancho

El typedef nombre int N _t designa un tipo entero firmado con N, no hay bits de relleno de ancho, y una representación en complemento a dos . Por lo tanto, int8_t denota un tipo entero con signo con un ancho de exactamente 8 bits.

El nombre typedef uint N _t designa un tipo entero sin signo con N. anchura Por lo tanto, uint24_t denota un tipo entero sin signo con una anchura de exactamente 24 bits.

define

int8_t 
int16_t 
int32_t 
uint8_t 
uint16_t 
uint32_t 
6

Todas las respuestas aquí dejar de mencionar la verdadera razón de uint.
Obviamente es typedef de unsigned int, pero eso no explica su utilidad.

La verdadera pregunta es,

¿Por qué alguien quiere typedef un tipo fundamental para una versión abreviada ?

¿Guardar ahorrar en escribir?
No, lo hicieron por necesidad.

Considere el lenguaje C; un lenguaje que no tiene plantillas.
¿Cómo harías para acabar con tu propio vector que puede contener cualquier tipo?

Podría hacer algo con punteros vacíos,
pero una emulación más cercana de las plantillas le obligaría a recurrir a las macros.

Así definiría su vector plantilla:

#define define_vector(type) \ 
    typedef struct vector_##type { \ 
    impl \ 
    }; 

Declarar sus tipos:

define_vector(int) 
define_vector(float) 
define_vector(unsigned int) 

y tras generación, darse cuenta de que los tipos deberían ser de un solo símbolo:

typedef struct vector_int { impl }; 
typedef struct vector_float { impl }; 
typedef struct vector_unsigned int { impl }; 
+1

Esa es una posible razón, pero ¿puedes mostrar un ejemplo donde esa fue la razón real? –