2010-04-16 16 views

Respuesta

18

C99 no dice mucho sobre esto, pero puede verificar si sizeof(int) == 4, o puede usar tipos de tamaño fijo como uint32_t (entero sin signo de 32 bits). Se definen en stdint.h

+0

Quiero saber si sizeof (int)! = 4 cómo hacer un int 4 bytes yo mismo.gracias – kkpattern

+0

muchas gracias, y también gracias a todos los chicos – kkpattern

+0

@kkpattern, asegúrese de "aceptar" la respuesta haciendo clic en el gris fuera de la casilla de verificación junto a esta respuesta. Luego se pondrá verde y obtendrá un representante adicional de 2 :) – Earlz

0

Pruebe la constante INT_MAX en limits.h

+0

No, no creo que esté buscando el máximo valor posible de un int, está buscando la forma de garantizar el número de bytes utilizados por un int. – FrustratedWithFormsDesigner

+0

Entonces? Ellos son inseparables. Un valor de 4 bytes solo puede contener 2^32 valores. – Fred

+0

Dos lados de la misma moneda, no hay necesidad de pensar en esto, ya que el valor más alto y el número de bytes necesarios para representar el número están tan estrechamente relacionados. – Fred

0

¿Quieres exigir la forma 4 bytes?

Si solo quiere ver el tamaño de int tal como está compilado en cada plataforma, puede hacer sizeof(int).

+0

sí, quiero pedirle que sea de 4 bytes porque necesito ponerlo en un mensaje de socket. – kkpattern

0

sizeof (int) devolverá el número de bytes que int ocupa en la memoria en el sistema actual.

8

Si está utilizando C99 y requiere tipos enteros de un tamaño determinado, incluya stdint.h. Define tipos como uint32_t para un entero sin signo de exactamente 32 bits, y uint_fast32_t para un entero sin signo de al menos 32 bits y "rápido" en la máquina de destino por alguna definición de rápido.

edición: Recuerde que también puede utilizar campos de bits para obtener un número específico de bits (aunque puede no dar el mejor rendimiento, especialmente con tamaños “extraños”, y la mayoría de los aspectos está definido por la implementación):

typedef struct { 
    unsigned four_bytes:32; 
    unsigned two_bytes:16; 
    unsigned three_bits:3; 
    unsigned five_bits:5; 
} my_message_t; 

Editar 2: También recuerde que sizeof devuelve el número de char s. Es teóricamente posible (aunque muy poco probable actualmente) que char no sea de 8 bits; el número de bits en un char se define como CHAR_BIT en limits.h.

+0

bitfields es increíble! :) gracias – kkpattern

+0

Solo tenga en cuenta que la representación exacta de bitfields depende de la implementación y puede hacer que el compilador genere cantidades inesperadas de código extra, por ejemplo para manejar tamaños de campo "extraños" como 3 bits. Y no puede tener punteros a miembros del campo de bits, etc. Es mejor usar los tipos 'stdint.h' si encuentra los adecuados allí. Pero los bitfields pueden ser útiles si necesita empacar datos para que coincidan con los requisitos de hardware o similares. – Arkku

+0

@Arkku bitfields es tan sutil. Gracias por su nota – kkpattern

0

Supongo que quieres algo más que el obvio sizeof (int) == 4 cheque. Es probable que desee un control en tiempo de compilación.

En C++, puede usar BOOST_STATIC_ASSERT.

En C, puede hacer aserciones en tiempo de compilación escribiendo código que intente crear matrices de tamaño negativo en caso de error o que intente crear sentencias switch con casos redefinidos. Consulte esta pregunta de stackoverflow para obtener ejemplos: Ways to ASSERT expressions at build time in C

0

Puede usar sizeof (int), pero nunca puede suponer qué tan grande es una int. La especificación C no establece suposiciones sobre el tamaño de un int, excepto que debe ser mayor o igual al tamaño de un short (que debe ser mayor o igual al tamaño de un char).

A menudo, el tamaño de un int se alinea con el hardware subyacente. Esto significa que int es generalmente lo mismo que una palabra, donde una palabra es el tamaño funcional de los datos obtenidos del bus de memoria (o, a veces, del ancho de registro de la CPU). No tiene que ser lo mismo que una palabra, pero las primeras notas que he indicado deberían ser el tamaño preferido para la transferencia de memoria (que generalmente es una palabra).

En el pasado, ha habido 18 bit ints (PDP-8) y 24 bit ints (PDP-15). Ha habido arquitecturas con tamaños de palabra de 36 bits (PDP-11), pero no recuerdo cuál fue su tamaño int.

En las plataformas Linux, se puede echar un vistazo en

#include <sys/types.h> 

para obtener el recuento de bits real para cada tipo.

0

Anoche encontré que visual studio 2008 no es compatible con C99, y no es compatible con stdint.h. PERO tienen sus propios tipos. aquí es un ejemplo:

#ifdef _MSC_VER 
typedef __int8 int8_t; 
typedef unsigned __int8 uint8_t; 
typedef __int16 int16_t; 
typedef unsigned __int16 uint16_t; 
typedef __int32 int32_t; 
typedef unsigned __int32 uint32_t; 
typedef __int64 int64_t; 
typedef unsigned __int64 uint64_t; 
#else 
#include <stdint.h> 
#endif