如何使用Base 8(八进制)数字?

时间:2014-10-20 03:32:19

标签: c++ octal

在C ++中,八进制数由其前面的0定义,例如:

01 = 1
010 = 8
014 = 12

所以我正在试验如何在C ++中使用Base 8,并尝试使用循环添加它,如下所示:

int base8Number = 00;
for (int i = 01; i < 011; i+=01)
{
    base8Number += i;
    cout << base8Number << '\n';
}

显然,C ++并不喜欢使用八进制数字,我得到的输出如下:

1
3
6
10
15
21
28
36

我知道它在Base 8中不起作用的最明显的原因是28输出结果,因为基数8中没有使用8数字。

所以,我的问题:你可以在C ++中使用Base 8,或者它只是用作常量,如果你可以在c ++中使用Base 8,你怎么做?

3 个答案:

答案 0 :(得分:4)

首先,让我们记住,当我们按照您的方式打印数字时,它们将以十进制显示。

现在,让我们在没有八进制的情况下重写代码:

int base10Number = 0;
for (int i = 1; i < 9; i+=1)
{
    base10Number += i;
    cout << base10Number << '\n';
}

现在让我们来看看你的代码实际在做什么:

cout << 1             << "\n"; // 1
cout << 1 + 2         << "\n"; // 3
cout << 1 + 2 + 3     << "\n"; // 6
cout << 1 + 2 + 3 + 4 << "\n"; // 10
....

你正在看到的是什么。所以没有,八进制在c ++中的工作方式没有问题。

如果您愿意,可以使用std::oct告诉std::cout使用八进制打印。例如:

int main() {
    std::cout << std::oct << 25 << "\n"; // Outputs: 31
}

答案 1 :(得分:2)

请记住,“base”是数字表示的属性,而不是数字本身。如果你有足够的钉子可以在每根手指上放一个钉子,那么无论你是写10012 0xA还是其他任何东西,这都是相同数量的钉子。

您的代码计算将在基数10中显示为1361015等的数字。您输出在基数为8的情况下输出它们:

std::cout << std::oct << base8Number << std::endl;

答案 2 :(得分:1)

这里有几件事情。

本质上,您的计算机以二进制(基础2)运行。当您执行int foo = 10;之类的操作时,您以十进制格式表示数字10,因为它方便您以这种方式阅读,但最终计算机仍会使用它来存储它二进制,例如1010

如果您要使用八进制文字(例如012),那么就计算机而言仍然只是1010二进制常数 - 唯一的事情改变的是它在源代码中的表示。

最后,最后要意识到的是,计算机默认会在基数10中输出整数,因为这对人们来说很容易阅读。它仍在输出数字1010,只是使用它的十进制表示。

考虑到上述所有情况,您的代码完全等同于执行以下操作,您可以自己验证生成相同的输出而不使用任何八进制:

int num = 0;
for (int i = 1; i < 9; i += 1) // Constants the same, just changed from octal representation to decimal.
{
    num += i;
    cout << num << '\n'; // Outputs in decimal, as with original program.
}

要获得您的期望,请尝试使用oct修饰符:

int base8Number = 00;
for (int i = 01; i < 011; i+=01)
{
    base8Number += i;
    cout << oct << base8Number << '\n';
    //       ^--Here. Explicitly requests octal output.
}

然后显式请求计算机使用八进制输出值。