Quiero saber cómo anunciar int para asegurarse de que sea de 4 bytes o corto en 2 bytes sin importar en qué plataforma. ¿C99 tiene reglas sobre esto?Cómo asegurarse de que un int es de 4 bytes o 2 bytes en C/C++
Respuesta
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
Quiero saber si sizeof (int)! = 4 cómo hacer un int 4 bytes yo mismo.gracias – kkpattern
muchas gracias, y también gracias a todos los chicos – kkpattern
@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
Pruebe la constante INT_MAX
en limits.h
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
Entonces? Ellos son inseparables. Un valor de 4 bytes solo puede contener 2^32 valores. – Fred
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
¿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)
.
sí, quiero pedirle que sea de 4 bytes porque necesito ponerlo en un mensaje de socket. – kkpattern
sizeof (int)
devolverá el número de bytes que int
ocupa en la memoria en el sistema actual.
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
.
bitfields es increíble! :) gracias – kkpattern
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
@Arkku bitfields es tan sutil. Gracias por su nota – kkpattern
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
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.
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
- 1. Convertir 4 bytes a int
- 2. Float e Int ¿Ambos 4 bytes? ¿Cómo?
- 3. Java - ¿Convertir int a Byte Array de 4 bytes?
- 4. conversión de bytes a int en Java
- 5. 4 bytes sin firmar int en SQL Server?
- 6. ¿Tiene un carácter 1 byte o 2 bytes en Java?
- 7. Convertir 16 bits con la firma int a 2 bytes?
- 8. Int matriz de bytes a
- 9. C# int conversión de bytes
- 10. Convierte 2 bytes a un número
- 11. Conversión de un int a un valor hexadecimal de 2 bytes en C
- 12. readframes vuelven 2 bytes en Python
- 13. ¿Cómo se representan los caracteres de 4 bytes en C#
- 14. convertir una cadena de bytes en un int (python)
- 15. 2 bytes a short java
- 16. Android: ¿toma poco realmente 2 bytes?
- 17. Operadores de bit a bit y conversión de un int a 2 bytes y viceversa
- 18. ¿Por qué hay un booleano de 4 bytes en .NET?
- 19. C++ asegurando un tamaño flotante de 4 bytes
- 20. 2 bytes representan 3 enteros en C
- 21. ¿Cómo convierto un int a dos bytes en C#?
- 22. C# Big-endian ulong de 4 bytes
- 23. ¿Por qué mode_t usa 4 bytes?
- 24. es nulo JSON válida (4 bytes, nada más)
- 25. ¿Cómo convertir una matriz de bytes int a little endian?
- 26. Cómo convertir una matriz de bytes en una matriz int?
- 27. Bytes de escritura en un archivo sin borrar bytes existentes
- 28. ¿Tamaño de bytes personalizado?
- 29. cómo leer int firmado desde bytes en java?
- 30. ¿Cómo convertir una matriz de bytes a una matriz int?
@Pavel que realmente debería estar en el FAQ – Earlz
@Pavel gracias, estoy muy feliz de haber encontrado Stackoverflow en Internet. – kkpattern