2012-01-26 19 views
5

Actualmente estoy empezando con microcontroladores de programación utilizando C30 (A C compilador basado en GCC del microchip para sus dispositivos PIC24) y me permitió Strict ANSI warnings por curiosidad. En primer lugar, no sabía que en C11 las marcas de comentarios como // son "incorrectas" y en su lugar debería usar/* blah blah * /, pero lo que realmente me sorprendió es esta advertencia para una línea de código.¿Cómo uso un prefijo binario de acuerdo con C11?

"aviso: uso de prefijo binario no estándar"

La línea de código es:

OSCCONbits.COSC = 0b000;

He mirado en línea en uno de los borradores de C11 (ISO/IEC 9899 : 2011) y no se puede encontrar nada sobre los prefijos binarios en C. http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf

¿Cuál es la notación binaria correcta para C según C11?

+1

convertirlo a un número hexadecimal. En cuanto a establecer algo en (binario) '0000', ¿por qué no simplemente usar un decimal normal' 0' o hexadecimal '0x00'? –

+6

¿Quién te dijo que // los comentarios son "incorrectos"? –

+0

Creo que puedo haber formulado mal mi pregunta, así que aquí hay algunas correcciones. Sé que puedo usar hexadecimal o decimal en lugar de binario, solo quería saber cuál era la forma "correcta" de usar literales binarios. En cuanto a mí diciendo que // los comentarios son "incorrectos", lo obtuve de una advertencia del compilador, nadie me dijo eso, sino el compilador. De todos modos, gracias por toda la ayuda chicos! Obtuve algunas respuestas asombrosas y desearía poder marcarlas todas como respuestas, pero podría hacerlo solo a uno con tristeza. – hak8or

Respuesta

13

C no tiene constantes binarias. (Incluso en C11 no son compatibles).

Se propusieron como una adición a C99 pero la proposición fue rechazada.

Desde C99 documento Justificación:

Una propuesta de añadir las constantes binarias fue rechazada debido a la falta de precedentes e insuficiente utilidad.

Usted ha dicho que está utilizando un compilador basado gcc y gcc soporta constantes binarias: son una extensión de GNU para el lenguaje C.

Las constantes enteras se pueden escribir como constantes binarias, que consiste en una secuencia de 0 y 1 dígitos, con el prefijo 0b o 0B. Esto es particularmente útil en entornos que operan mucho en el nivel de bits (como los microcontroladores).

Ver gcc página acerca de las constantes binarias para más información:

http://gcc.gnu.org/onlinedocs/gcc/Binary-constants.html

+0

Bummer sintieron que no era de utilidad suficiente. Yo uso '0b' todo el tiempo en el código que hace que los bits se muevan para las operaciones enteras de alta velocidad (que no tienen nada que ver con los microcontroladores). '0b10101010' es mucho más legible para mí que' 0xAA', por ejemplo. También un fastidio que sentían que no había precedentes; Java ha tenido '0b' desde hace un tiempo. –

3

C11 no tiene literales binarios; solo tiene decimales, octales y hexadecimales, como se describe en la sección 6.4.4.1 del estándar. Esto no ha cambiado desde C99.

6.6 párrafo 10 dice:

Una implementación puede aceptar otras formas de expresiones constantes.

que, si lo entiendo correctamente, permite el tipo de extensión que proporciona su compilador; esto tampoco se modifica desde C99.

La solución habitual es utilizar literales hexadecimales; cada dígito hexadecimal corresponde a cuatro dígitos binarios. (Y, por supuesto, 0b000 puede escribirse simplemente como 0.)

+0

Gracias por su respuesta. :) – hak8or

1

Los prefijos binarios no son estándar. en cambio, conviértalos a octal (0) o hexadecimal (0x), que son solo prefijos definidos en el estándar.

Además, // se introdujeron los comentarios en el estándar C99, no están presentes en el estándar C89 ANSI. Es por eso que su compilador le da una advertencia.

+0

Gracias por su respuesta. :) – hak8or

2

estándares con respecto a:

  • ANSI C/"Estricto ANSI" típicamente se refiere a la primera versión estándar de C, estandarizado sólo en los EE.UU. 1989. A veces se refiere como "C89".
  • ANSI C/89 quedó obsoleto en 1990 cuando C se convirtió en un estándar internacional C, ISO/IEC 9899: 1990, denominado "C90". C89 y C90 son equivalentes cuando se trata de detalles técnicos.
  • C90 quedó obsoleto en 1999, cuando se actualizó ISO C. El nuevo estándar se conoce como "C99".
  • C99 quedó obsoleto en 2011. El nuevo estándar se conoce como "C11".

En cuanto a sus problemas del compilador:

  • C89/C90 no permite // comentarios. Fueron presentados en C99.No han sido eliminados en C11.
  • La notación binaria nunca ha sido parte de ningún estándar C.

Conclusión:

  • Lo más probable es compilar el código en un compilador C90, con algunas extensiones no estándar disponibles.
+0

Gracias por su respuesta. :) – hak8or

Cuestiones relacionadas