Batch file 批处理文件乘法正变量返回负数

Batch file 批处理文件乘法正变量返回负数,batch-file,multiplication,area,Batch File,Multiplication,Area,我一直在做一个批量多边形面积计算器,我遇到了一个问题。 我需要乘以两个变量,但有时如果两个正变量很大,它会返回一个负数 下面是一个示例:999999*999999返回-729379967 代码如下: REM计算平方面积 :PolySqu Cls 回波多边形面积计算器 对于(1,1,57)中的/L%%P,请执行回显。 设置/P“InputPolygonCalSqu=输入一条线的长度(以厘米为单位): Set/A SquArea=InputPolygonCalSqu*InputPolygonCalS

我一直在做一个批量多边形面积计算器,我遇到了一个问题。 我需要乘以两个变量,但有时如果两个正变量很大,它会返回一个负数

下面是一个示例:
999999*999999
返回
-729379967

代码如下:

REM计算平方面积
:PolySqu
Cls
回波多边形面积计算器
对于(1,1,57)中的/L%%P,请执行回显。
设置/P“InputPolygonCalSqu=输入一条线的长度(以厘米为单位):
Set/A SquArea=InputPolygonCalSqu*InputPolygonCalSqu
Cls
回波多边形面积计算器
对于(1,1,57)中的/L%%P,请执行回显。
该正方形的面积为%SquArea%cm2。
暂停
后藤:多角形
这似乎是命令

Set /A SquArea="InputPolygonCalSqu * InputPolygonCalSqu

无法正确计算。

批处理使用32位整数存储数字。这使它们的最大大小为2^31-1=2147483647

9999999*9999999=999999800001,大于2147483647,因此它“包裹”并从底片开始

这是批处理的一个限制,尽管有一些限制。

这可能有用

批次可接受的最大数量为2^31-1=2147483647


因此,它再次从负数开始,并给出答案。

我注意到,使用纯批处理,实现支持超过32位整数限制的数字的操作有些困难。因此,我限制了这些数字,这样它们在相乘时就不会溢出

REM Calc Square Area
:PolySqu
Cls
Echo                       Polygon Area Calculator
For /L %%P In (1,1,57) Do Echo.
Set /P "InputPolygonCalSqu=Enter one of the line's length in cm [Less then 40000] :"
If %InputPolygonCalSqu% GTR 40000 Goto :PolySqu

Set /A SquArea="InputPolygonCalSqu * InputPolygonCalSqu


Cls
Echo                       Polygon Area Calculator
For /L %%P In (1,1,57) Do Echo.
Echo The area of this square is %SquArea% cm2.
Pause
Goto :PolygonCal 

正如其他人已经指出的,本机只支持32位有符号整数算术

以下代码构成了将大于232限制的非负数相乘的变通方法− 1=2147483647,使用纯命令(我们称之为
multiply.bat
):

@echo关闭
setlocal EnableExtensions DisableDelayedExpansion
rem//在此处定义参数:
设置“NUM1=%~1”
设置“NUM2=%~2”
设置“NUM3=%~3”
设置“NUM4=%~4”
如果定义NUM1,则设置“NUM1=%NUM1:=”%
如果定义了NUM2,则设置“NUM2=%NUM2:=”%
如果定义了NUM3,则设置“NUM3=%NUM3:”=%
呼叫:VAL|u ARGS NUM1 NUM2 NUM4 | |退出/B 1
rem//在此处定义常量:
设置/A“挖掘=4”和设置“焊盘=”
setlocal EnableDelayedExpansion
对于/L%%J in(1,1,%DIG%)设置“PAD=!PAD!0”
endlocal&设置“PAD=%PAD%”
rem//确定字符串长度:
电话:STR_LEN LEN1 NUM1
电话:STR_LEN LEN2 NUM2
设置/A“LEN1=(LEN1-1)/DIG*DIG”
设置/A“LEN2=(LEN2-1)/DIG*DIG”
设置/A“LIM=LEN1+LEN2+DIG”
对于(0,%DIG%,%LIM%)中的/L%%I,请设置/A“RES[%%I]=0”
rem//执行分块乘法:
setlocal EnableDelayedExpansion
对于/L%%J in(0,%DIG%,%LEN2%)do(
对于在(0,%DIG%,%LEN1%)中的/L%%I,请执行以下操作(
设置/A“IDX=%%I+%%J”
如果%%I等于0(设置为“AUX1=-%DIG%”),则为其他(
设置/A“AUX1=%DIG%%+%%I”&设置“AUX1=-!AUX1!,-%%I”
)
如果%%J等于0(设置“AUX2=-%DIG%”),则为其他(
设置/A“AUX2=%DIG%+%%J”并设置“AUX2=-!AUX2!,-%%J”
)
对于(“!AUX1!!AUX2!”)中的/F“tokens=1,2”%%M,请执行以下操作(
设置“AUX1=!NUM1:~%%M!”&设置“AUX2=!NUM2:~%%N!”
)
呼叫:NO_LEAD0 AUX1!AUX1!
呼叫:NO_LEAD0 AUX2!AUX2!
设置/A“RES[!IDX!]+=AUX1*AUX2”
设置/A“NXT=IDX+DIG,DIT=DIG*2”
对于(“!IDX!!NXT!!DIT!”)中的/F“tokens=1,2,3”%%M,请执行以下操作(
设置“AUX=!RES[%%M]:~-%%O,-%DIG%!”
设置/A“RES[%%N]+=AUX”
设置“RES[%%M]=!RES[%%M]:~-%DIG%!”
呼叫:无线索0 RES[%%M]!RES[%%M]!
)
)
)
rem//生成结果产品:
设置“RES=”&设置“AUX=”
对于/L%%I in(0,%DIG%,%LIM%)do(
设置/A“RES[%%I]+=AUX”
设置/A“NXT=%%I+DIG”
对于(!NXT!,%DIG%,!NXT!)中的/L%%J,请执行以下操作(
设置“AUX=!RES[%%I]:~-%%J,-%DIG%!”
)
设置“RES[%%I]=%PAD%!RES[%%I]!”
设置“RES=!RES[%I]:~-%DIG%!!RES!”
)
endlocal&设置“RES=%RES%”
通话:无线索0分辨率%RES%
rem//返回结果产品:
回声(%RES%
如果定义NUM3(
端部
设置“%NUM3%=%RES%”
)否则(
端部
)
退出/B
:无导线0 rtn变量值
rem//从数字中删除前导零:
对于/F“tokens=*delims=0”%%%Z in(“%2”)do(
设置“%~1=%%Z”&如果未定义,则设置“%~1=0”
)
退出/b0
:STR_LEN rtn_长度参考字符串
rem//检索字符串的长度:
setlocal EnableDelayedExpansion
设置“STR=!%~2!”
如果未定义STR(set/A LEN=0),则为其他(set/A LEN=1)
对于%%L英寸(4096 2048 1024 512 256 128 64 32 16 8 4 2 1),请执行以下操作(
如果定义STR(
设置“INT=!STR:~%%L!”
如果不是“!INT!”==”集/A LEN+=%%L&集“STR=!INT!”
)
)
endlocal&设置“%~1=%LEN%”
退出/b0
:VAL_ARGS ref_arg1 ref_arg2 ref_arg3
rem//检查参数的有效性:
如果未定义,%1>&2回显错误:给出的参数太少!&B退出/B 1
如果未定义,%2>&2回显错误:给出的参数太少!&退出/B 1
如果定义了%%3>&2回显错误:给出的参数太多!&退出/B 1
(调用echo“%%~1%%”|>nul findstr/R/C:“^\”[0-9][0-9]*\“$”)(
>&2回显错误:参数1不是纯数字!&退出/B 1
)
(调用echo“%%~2%%”|>nul findstr/R/C:“^\”[0-9][0-9]*\“$”)(
>&2回显错误:参数2不是纯数字!&退出/B 1
)
退出/b0
要使用它,请提供两个要相乘的数字作为命令行参数;例如:

multiply.bat 999999 999999
在控制台上返回生成的产品:

如果提供第三个参数,则产品将分配给具有该名称的变量;例如:

multiply.bat 999999 999999 SquArea
这会将变量
SquArea
设置为结果值。后者仍会在控制台上返回。
要在无任何额外控制台输出的情况下以静默方式分配变量,请将其重定向到
nul
设备:

multiply.bat 999999 999999 SquArea > nul

这是我推荐在带有[batch file]标记的问题上使用PowerShell的仅有两种情况之一。对于使用双精度浮点数学的方法,谢谢您的解决方案,我已经指出了问题。也许您可能对。。。
multiply.bat 999999 999999 SquArea > nul