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


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:

进行八进制处理

八进制整数字面值(以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;

最新更新