【问题标题】:Why is 02000 evaluated to 1024 [duplicate]为什么02000被评估为1024 [重复]
【发布时间】:2018-12-07 01:56:40
【问题描述】:

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

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

【问题讨论】:

  • 前导零使int 值成为octal 值。
  • 引出一个有趣的旁注:在 C++ 中,0 被明确声明为八进制,但在 PHP 中它是十进制。
  • @smith,我应该删除这个问题,因为它肯定是重复的吗?

标签: php c++ zero arithmetic-expressions


【解决方案1】:
  • 使用 auto 时, Number2 被视为八进制数因为它以 0 开头

  • 所以 number2=1024、number1=100 和 number3=2。

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

编辑:

学到了新东西!自动在这里无关!它只是前面的 0 。

【讨论】:

  • 注意,auto与此无关
  • @mahbubcseju 如果不使用 auto 怎么办?它不会被视为八进制吗?
  • 好的!我现在才知道!它仅用于前面的 0 !谢谢 。学到了新东西:)
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    它将 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 是数字 2。

    result = (100 + 1024)/2
           = 1124/2
           = 562
    

    【讨论】:

      猜你喜欢
      • 2020-04-03
      • 2020-08-15
      • 2023-03-20
      • 1970-01-01
      • 2017-04-28
      • 1970-01-01
      • 1970-01-01
      • 2014-01-05
      • 2014-05-19
      相关资源
      最近更新 更多