为什么 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.
出于好奇,我写了一个这样的程序:
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.