前面为 0 的 C++ int 会更改整个值

C++ int with preceding 0 changes entire value

我有一个非常奇怪的问题,如果我像这样声明一个 int

int time = 0110;

然后显示到控制台返回的值为72。但是,当我删除前面的 0 以便 int time = 110; 控制台会按预期显示 110

我想知道两件事,首先为什么它在 int 的开头使用前面的 0 来执行此操作,并且有没有办法停止它以便 0110 至少等于 110?
其次有什么方法可以保留它以便0110 returns 0110?
如果你对变量名进行猜测,我正在尝试以 24 小时的时间进行操作,但此时 1000 之前的任何时间都会因此而导致问题。

提前致谢!

开头为零表示数字为八进制。没有它是小数。

编译器将前导零解释为八进制数。 “110”的八进制值为十进制的 72。如果您只是存储一个 int 值,则不需要前导零。

您正在尝试存储 "time" 它出现在时钟上的样子。这实际上比简单的 int 更复杂。您可以改为存储自午夜以来的分钟数。

从0开始的整型字面量定义八进制整型字面量。现在在 C++ 中有四类整数文字

integer-literal:
    decimal-literal integer-suffixopt
    octal-literal integer-suffixopt
    hexadecimal-literal integer-suffixopt
    binary-literal integer-suffixopt

八进制整数字面量定义如下

octal-literal:
    0 octal-literal
    opt octal-digit

也就是从0开始

因此这个八进制整数文字

0110

对应以下十进制数

8^2 + 8^1 

等于72.

您可以通过运行以下简单程序

确定八进制表示的 72 等于 110
#include <iostream>
#include <iomanip>

int main() 
{
    std::cout << std::oct << 72 << std::endl;

    return 0;
}

输出为

110

这是因为整数文字。在数字前放置 0 表示它是八进制数。对于二进制,它是 0b,对于十六进制,它是 0x0X。你不需要为十进制写任何东西。请参阅下面的代码。

#include<stdio.h>

int main()
{
    int binary = 0b10;
    int octal=010;
    int decimal = 10;
    int hexa = 0x10;
    printf("%d %d %d %d\n", octal, decimal, hexa, binary);
}

有关详细信息,请访问 tutorialspoint