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

11,836

Solution 1

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

Solution 2

Regarding standards:

  • ANSI C / "Strict ANSI" typically refers to the first standard version of C, standardized only in the USA 1989. Sometimes it is referred to as "C89".
  • ANSI C/89 became obsolete in 1990 when C became an international C standard, ISO/IEC 9899:1990, referred to as "C90". C89 and C90 are equivalent when it comes to technical details.
  • C90 became obsolete in 1999, when ISO C was updated. The new standard is referred to as "C99".
  • C99 became obsolete in 2011. The new standard is referred to as "C11".

Regarding your compiler problems:

  • C89/C90 does not allow // comments. They were introduced in C99. They have not been removed in C11.
  • Binary notation has never been part of any C standard.

Conclusion:

  • You are most likely compiling the code on a C90 compiler, with some non-standard extensions available.

Solution 3

C11 does not have binary literals; it only has decimal, octal, and hexadecimal, as described in section 6.4.4.1 of the standard. This is unchanged from C99.

6.6 paragraph 10 says:

An implementation may accept other forms of constant expressions.

which, if I understand it correctly, permits the kind of extension that your compiler provides; this is also unchanged from C99.

The usual workaround is to use hexadecimal literals; each hexadecimal digit corresponds to four binary digits. (And of course 0b000 can be written simply as 0.)

Solution 4

Binary prefixes are not standard. convert them to octal (0) or hexadecimal (0x) instead, which are only prefixes defined in the standard.

Also, // comments were introduced in C99 standard, they're not present in C89 ANSI standard. That's why your compiler gives you a warning.

Share:
11,836
hak8or
Author by

hak8or

Updated on June 14, 2022

Comments

  • hak8or
    hak8or almost 2 years

    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?