int main()
{
uint32_t n1 = 00000000000000000000000000001000;
uint32_t n2 = 00000000000000000000000000000100;
cout << n2;
}
Когда я использую Visual Studio 2013 (C ++), я получаю результат как 64.
Почему это превращается в восьмеричную систему счисления вместо двоичной?
Это потому, что номер с ведущей 0
считается восьмеричным числом:
auto num = 04; //Octal number
В C ++ 14 и более поздних версиях, если вы хотите указать двоичные числа, вам придется использовать 0b
префикс:
uint32_t n2 = 0b00000000000000000000000000000100;
^^
Если вы не можете использовать C ++ 14, вам придется использовать битовые сдвиги или аналогичные методы, чтобы получить желаемый результат.
Для десятичных чисел вы будете иметь избавиться от ведущих 0
s.
Начиная числовой литерал с 0
означает, что вы хотите, чтобы оно интерпретировалось как восьмеричное, что, как я полагаю, вы имели в виду, когда использовали «восьмеричное», слово, которого я раньше не видел, и, хотя оно выглядит как настоящее слово, вы, вероятно, получите несколько пустых взглядов, если вы используете его 🙂
Это лечение как восьмеричное в соответствии со стандартом, C++11 2.14.2 Integer literals /1
:
Восьмеричный целочисленный литерал (восьмое основание) начинается с цифры 0 и состоит из последовательности восьмеричных цифр.
Для двоичных чисел, вероятно, самый простой способ сделать это — сдвиг битов (до C ++ 14):
uint32_t n1 = 1u << 3;
uint32_t n2 = 1u << 2;
C ++ 14 обеспечивает 0b
префикс, родственный 0x
один для шестнадцатеричных чисел, но я не совсем уверен, что он так же удобен для чтения, как другой вариант, если вы все еще используете большое количество начальных нулей:
uint32_t n1 = 0b00000000000000000000000000001000;
uint32_t n2 = 0b00000000000000000000000000000100;
Опытные программисты, конечно же, могут мгновенно отображать из двоичного кода в гекс, поэтому, вероятно, просто использовали бы:
uint32_t n1 = 0x00000008;
uint32_t n2 = 0x00000004;