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

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

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

4

2 回答 2

3

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

auto num = 04; //Octal number

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

uint32_t n2 = 0b00000000000000000000000000000100;
              ^^

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

对于十进制数,您必须去掉前导0的 s。

于 2016-08-20T04:47:30.417 回答
2

以数字文字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;
于 2016-08-20T04:46:52.100 回答