What does "0b" and "0x" stand for when assigning binary and hex?

0b (or 0B) denotes a binary literal. C++ has allowed it since C++14. (It's not part of the C standard yet although some compilers allow it as an extension.) 0x (or 0X) is for hexadecimal.

0 can be used to denote an octal literal. (Interestingly 0 itself is an octal literal). Furthermore you use the escape sequence \ followed by digits to be read in octal: this applies only when defining const char[] literals using "" or char or multicharacter literals using ''. The '\0' notation that you often see to denote NUL when working with strings exploits that.

In the absence of a user defined literal suffix, any numeric literal starting with a non-zero is in denary.

There are rumblings in the C++ world to use 0o for an octal literal and perhaps even drop support for the leading zero version. Although that would be an hideous breaking change.


Any and all integer literals you can create are summarized in the C++ standard by the grammar production at [lex.icon]

integer-literal:
    binary-literal integer-suffixopt
    octal-literal integer-suffixopt
    decimal-literal integer-suffixopt
    hexadecimal-literal integer-suffixopt

binary-literal:
    0b binary-digit
    0B binary-digit
    binary-literal 'opt binary-digit

octal-literal:
    0
    octal-literal 'opt octal-digit

decimal-literal:
    nonzero-digit
    decimal-literal 'opt digit

hexadecimal-literal:
    hexadecimal-prefix hexadecimal-digit-sequence

binary-digit:
    0
    1

octal-digit: one of
    0  1  2  3  4  5  6  7

nonzero-digit: one of
    1  2  3  4  5  6  7  8  9

hexadecimal-prefix: one of
    0x  0X

hexadecimal-digit-sequence:
    hexadecimal-digit
    hexadecimal-digit-sequence 'opt hexadecimal-digit

hexadecimal-digit: one of
    0  1  2  3  4  5  6  7  8  9
    a  b  c  d  e  f
    A  B  C  D  E  F

As we can deduce from the grammar, there are four types of integer literals:

  • Plain decimal, that must begin with a non-zero digit.
  • Octal, any number with a leading 0 (including a plain 0).
  • Binary, requiring the prefix 0b or 0B.
  • Hexadecimal, requiring the prefix 0x or 0X.

The leading 0 for octal numbers can be thought of as the "O" in "Octal". The other prefixes use a leading zero to mark the beginning of a number that should not be interpreted as decimal. "B" is intuitively for "binary", while "X" is for "hexadecimal".


What does the 0b and 0x mean?

They mean that the nuneric literal is respectively in binary and hexadecimal base.

Can you have other values instead of 0?

A numeric literal starting with a non zero digit will be a decimal literal.

Also as another curious question, what other characters can go in the place of "b" and "x"?

Besides b and x, any octal digit can go there in which case it is the most significant digit of an octal literal.

Tags:

C++

Hex

Binary