¿Campos de bits de tipo distinto de int?

5 minutos de lectura

¿Campos de bits de tipo distinto de int
media áurea

Tengo un código que usa campos de bits declarados de la siguiente manera

typedef struct my{
    const char *name;
    uint8_t is_alpha : 1;   
    uint8_t is_hwaccel : 1; 
    uint8_t x_chroma_shift; 
    uint8_t y_chroma_shift; 

} mystr; 

uint8_t está escrito para unsigned char.

Construir el código en MS-VS 2008 usando estos campos de bits da una advertencia como la siguiente:

imgconvert.c(60) : warning C4214: nonstandard extension used : bit-field types other than int.
  1. ¿Hay algún problema/problema potencial en el uso de campos de bits de otro tipo que no sea int? ¿Por qué la advertencia?
  2. ¿Los archivos de bits de tipo int no están permitidos por la especificación del lenguaje C99 C?

  • La advertencia se explica por sí misma: extensión no estándar utilizada ; su código puede tener problemas de portabilidad.

    – mmx

    17 de febrero de 2010 a las 12:28


  • @Mehrad: Usar el tipo int es útil desde el punto de vista de la portabilidad solo si todos los objetivos/compiladores tienen entradas del mismo tamaño.

    – media áurea

    17 de febrero de 2010 a las 12:51

  • está escribiendo sobre campos de bits aquí, su tamaño se especifica en el código.

    – Un programador

    17 de febrero de 2010 a las 13:27

  • El problema no es el tamaño del campo de bits (se especifica), sino el tamaño del campo de bits máximo (no más grande que el tipo) o el relleno (dos bits de 1 se empaquetan en un int de 8 bits con 6 bits sin usar, para un int sería ser 2 usados ​​y 30 gratis).

    – eckes

    07/03/2016 a las 22:39

  • Otro hilo que te puede interesar: stackoverflow.com/questions/54719855/…

    – smwikipedia

    18 de febrero de 2019 a las 3:31

¿Campos de bits de tipo distinto de int
dirkgently

1]¿Hay algún problema/problema potencial al usar campos de bits de otro tipo que no sea int? ¿Por qué la advertencia?

Dado que los campos de bits son de bajo nivel, puede haber problemas con la portabilidad si utiliza tipos no estándar. De ahí la advertencia: tenga en cuenta que sigue siendo una advertencia y no un error.

2]¿Están permitidos por la especificación del lenguaje C C99 otros archivos de bits que no sean de tipo int?

Del borrador de C99:

6.7.2.1 Especificadores de estructura y unión

4 Un campo de bits tendrá un tipo que sea una versión calificada o no calificada de _Bool, int con signo, int sin signo o algún otro tipo definido por la implementación.

  • ¿No es “algún otro tipo definido por la implementación” notablemente inútil en un documento de estándares?

    luego

    17 de febrero de 2010 a las 12:34

  • @Neil Butterworth: Cajero automático, solo tengo el borrador. Sin embargo, tendrá que buscar el real. Pero sí, supongo que tienes razón.

    – dirkgently

    17 de febrero de 2010 a las 12:42

  • @dirkgently: el uso de type int es útil desde el punto de vista de la portabilidad solo si se garantiza que todos los objetivos/compiladores tienen ints del mismo tamaño. Es esta una suposición razonable. no se por eso pregunto

    – media áurea

    17 de febrero de 2010 a las 12:51

  • @goldenmean: No, solo la garantía estándar char tener el mismo tamaño en todas las máquinas. El tamaño de un intse define solo como un rango, por lo que no es muy útil desde la perspectiva de la portabilidad. los stdint El encabezado se agregó para este propósito a C99. Supongo que deberías estar de acuerdo con la advertencia.

    – dirkgently

    17 de febrero de 2010 a las 13:01

  • @dirkgently, sizeof(char) es uno, pero eso no significa que CHAR_BIT sea el mismo en todas las plataformas.

    – Un programador

    17 de febrero de 2010 a las 13:31

¿Por qué no usar? int? La implementación real de los campos de bits varía de un compilador a otro. Si desea escribir código portátil, utilice int. Si desea crear una estructura pequeña, o una estructura de un número fijo de bytes, o una estructura donde los bits están en una posición fija, no use campos de bits. Crear un uint8_t miembro llamado algo como flags y definir macros para usar como máscaras de bits.

  • Te refieres a unsigned int. uint8_t no está firmado, int está firmado, mezclarlos no es bueno.

    – kennytm

    17 de febrero de 2010 a las 16:49

  • Personalmente, no he usado campos de bits en el código, pero si es un campo de bits de 1 bit, ¿importa el signo?

    – tomlogic

    17 de febrero de 2010 a las 16:58

  • @tomlogic Sí, el letrero importa. Un campo con signo de 1 bit tiene un bit de signo y bits de valor cero. Por lo tanto, los campos firmados de 1 bit están expresamente prohibidos en MISRA C y otros estándares.

    – David R.

    24 de noviembre de 2020 a las 20:23

Como otros han mencionado sobre problemas de portabilidad y otros, si no lo sabía, puede desactivar la advertencia a través del pragma de advertencia:
https://docs.microsoft.com/en-us/cpp/preprocessor/warning?view=vs-2019

#pragma warning(push)
#pragma warning(disable: 4214) // warning C4214: nonstandard extension used: bit field types other than int
typedef struct my{
    const char *name;
    uint8_t is_alpha : 1;   
    uint8_t is_hwaccel : 1; 
    uint8_t x_chroma_shift; 
    uint8_t y_chroma_shift; 
} mystr; 
#pragma warning(pop)

También puede deshabilitar advertencias específicas en las propiedades de su proyecto, pero luego son para todo el proyecto. De esta manera puede controlarlos por tipo de datos.

Luego, si alguna vez no está 100% seguro de qué tipo de código binario MSVC generará para estos, ejecútelo en el depurador y mire la “vista de desensamblaje” (interrupción en dónde se accede), o cargue su ejecutable (con PDB archivo de símbolos) en un desensamblador como IDA Pro, Ghidra, etc.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad