为什么uint32_t的结果会自动变为八进制数?

时间:2016-08-20 04:44:05

标签: c++ uint32-t

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

当我使用Visual Studio 2013(C ++)时,我得到64的结果。

为什么这转向八进制数而不是二进制数?

2 个答案:

答案 0 :(得分:3)

那是因为带有前导0的数字被认为是八进制数字:

auto num = 04; //Octal number

在C ++ 14及更高版本中,如果要指定二进制数,则必须使用0b前缀:

uint32_t n2 = 0b00000000000000000000000000000100;
              ^^

如果您不能使用C ++ 14,则必须使用位移或类似技术来获得所需的结果。

对于十进制数字,您将 以摆脱前导0

答案 1 :(得分:2)

0开始一个数字文字意味着你希望它被解释为八进制,这就是我所说的当你使用&#34; octonary&#34;时所说的一个词,这是我以前见过的一个词而且,虽然它似乎是一个真实的词,但如果你使用它,你可能会得到一些空白的注意: - )

这种八元组的处理符合标准,C++11 2.14.2 Integer literals /1

  

八进制整数文字(基数为8)以数字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;