Почему результат того, что uint32_t автоматически становится восьмеричным числом?

int main()
{
uint32_t n1 = 00000000000000000000000000001000;
uint32_t n2 = 00000000000000000000000000000100;
cout << n2;
}

Когда я использую Visual Studio 2013 (C ++), я получаю результат как 64.

Почему это превращается в восьмеричную систему счисления вместо двоичной?

-3

Решение

Это потому, что номер с ведущей 0 считается восьмеричным числом:

auto num = 04; //Octal number

В C ++ 14 и более поздних версиях, если вы хотите указать двоичные числа, вам придется использовать 0b префикс:

uint32_t n2 = 0b00000000000000000000000000000100;
^^

Если вы не можете использовать C ++ 14, вам придется использовать битовые сдвиги или аналогичные методы, чтобы получить желаемый результат.

Для десятичных чисел вы будете иметь избавиться от ведущих 0s.

3

Другие решения

Начиная числовой литерал с 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;
2

По вопросам рекламы [email protected]