批处理文件不能处理大数字吗?

Isz*_*szi 5 batch-file

为了我自己的娱乐,我决定尝试编写一个批处理文件来计算Hailstone序列.但是,我遇到了一些带有大量数字的小问题.

一,代码:

:START
@ECHO OFF
SETLOCAL
SET /P InputVar="Input Number: "
ECHO.
ECHO %InputVar%
SET ItCount=0

:COLLATZ
SET /A ItCount=%ItCount%+1
SET /A Odd=%InputVar%%%2
IF %Odd% EQU 1 (
    SET /A OutputNum=%InputVar%*3+1
) ELSE (
    SET /A OutputNum=%InputVar%/2
)
ECHO %OutputNum%
IF %OutputNum% LSS 1 (
    GOTO ERROR
) ELSE (
    GOTO RECYCLE
)

:ERROR
ECHO.
ECHO ERROR!
GOTO END

:RECYCLE
IF %OutputNum% EQU 1 (
    GOTO FINISH
) ELSE ( 
    SET InputVar=%OutputNum%
    GOTO COLLATZ
)

:FINISH
ECHO.
ECHO Completed in %ItCount% iterations.

:END
ENDLOCAL
PAUSE
Run Code Online (Sandbox Code Playgroud)

这适用于我测试过的几个数字.然而,当我开始测试一个我将要完成数百次迭代的数字时,系统开始返回输出.有趣的是,负输出最终解决为零.但是,脚本的这种行为完全没有预期或意图.

添加错误处理后,这是我得到的输出8388607.

在此输入图像描述

根据谷歌的说法,下一个数字应该是2176782334.

这是命令处理器处理大数字的能力的自然限制吗?类似的操作在Excel中运行良好 - 在那里,我能够确定应该在473次迭代中将数量解析为1.

我正在运行Windows 7 SP1 x64.

Rob*_*ner 6

2176782334大于32位整数可以容纳.(2 ^ 31 - 1 = 2,147,483,647).您遇到的是整数溢出(导致负值).

大多数现代语言都有一种数据类型long,允许您保持-2 ^ 64到2 ^ 64 -1范围内的整数.甚至有数据类型允许无限精度整数,如Java BigInteger.

  • 它与 32 位或 64 位 cmd.exe 无关。在大多数现代系统中,类型 `int` 仍然是 32 位 (3认同)