What Does "0B" and "0X" Stand for When Assigning Binary and Hex?
When Assigning a Binary Value and a Hexadecimal Value Directly You Can Do It as Follows (Respectively): Uint8_T Val1 = 0B10101; Uint8_T Val2 = 0Xff; What Does...
When assigning a binary value and a hexadecimal value directly you can do it as follows (respectively):
uint8_t val1 = 0b10101;
uint8_t val2 = 0xFF;
What does the 0b and 0x mean? Specifically the 0 at the front. Can you have other values instead of 0?
Also as another curious question, what other characters can go in the place of b and x? Is there one for octal as an example?
3 Answers
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
0bor0B. - Hexadecimal, requiring the prefix
0xor0X.
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".
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.
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.