为什么 02000 被评估为 1024

Why is 02000 evaluated to 1024

出于好奇,我写了一个这样的程序:

auto number1 = 100;
auto number2 = 02000;
auto number3 = 2;

auto result = (number1 + number2) / number3;

std::cout << result;

有趣的是,程序输出 562。因此,在 visual studio 中,我将鼠标悬停在变量 "number2" 上,它显示 (int) 1024。我不明白为什么会这样。所以,我在 php 中尝试了它的等价物,它是这样的:

$number1 = 100;
$number2 = 02000;
$number3 = 2;

$result = ($number1 + $number2) / $number3;

echo $result;

结果是相同的 562。我错过了什么,因为如果我删除 number2 前面的零使其成为“2000”,它会按预期显示 1050

它把02000当作八进制数,转成十进制。任何以前面的 0 开头的都被认为是八进制数。

0 2 0 0 0 = 0*8*8*8*8 + 2*8*8*8 + 0*8*8 + 0*8 + 0
          = 0 + 2*512 + 0 + 0 + 0
          = 1024

现在 1024 是 number2。

result = (100 + 1024)/2
       = 1124/2
       = 562
  • 由于使用了auto, Number2 被认为是八进制数因为它以0开头。

  • 所以 number2=1024,number1=100,number3=2。

  • 这就是为什么结果是 562。

编辑:

learned a new thing ! Auto has nothing to do here ! It is just the preceding 0 .

嘿 Hemil 在 PL 的数字系统约定中,如果您使用 'zero' 作为前缀,数字将被视为八进制数字,但编译器会将其转换为十进制数字系统并以十进制输出。 02000是八进制的,十进制是1024.