Search code examples
ccompiler-constructionstandardsstandards-compliancec11

How do I use a binary prefix in accordance with C11?


I am currently starting out with programming micro controllers using C30 (A C compiler based on GCC from microchip for their PIC24 devices) and I enabled Strict ANSI warnings out of curiosity. First off, I did not know that in C11 comment markings like // are "wrong" and instead I should use /* blah blah */, but what really surprised me is this warning for a line of code.

"warning: use of non-standard binary prefix"

The line of code is:

OSCCONbits.COSC = 0b000;

I have looked online at one of the drafts of C11 (ISO/IEC 9899:2011) and can't find anything about binary prefixes in C. http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf

What is the correct binary notation for C according to C11?


Solution

  • C does not have binary constants. (Even in C11 they are not supported.)

    They were proposed as an addition to C99 but the proposition was rejected.

    From C99 Rationale document:

    A proposal to add binary constants was rejected due to lack of precedent and insufficient utility.

    You said you are using a compiler based gcc and gcc supports binary constants: they are a GNU extension to the C language.

    Integer constants can be written as binary constants, consisting of a sequence of 0 and 1 digits, prefixed by 0b or 0B. This is particularly useful in environments that operate a lot on the bit-level (like microcontrollers).

    See gcc page about binary constants for more information:

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