在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,你怎么做?
答案 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”是数字表示的属性,而不是数字本身。如果你有足够的钉子可以在每根手指上放一个钉子,那么无论你是写10
,012
0xA
还是其他任何东西,这都是相同数量的钉子。
您的代码计算将在基数10中显示为1
,3
,6
,10
,15
等的数字。您输出在基数为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.
}
然后显式请求计算机使用八进制输出值。