cmd.exe, а также set /a
использует только 32-разрядные целые числа, поэтому максимальное значение, которое он может представлять, равно 2147483647 = 2 32 - 1
Все числа должны находиться в диапазоне 32-разрядных целых чисел со знаком (от -2 147 483 648 до 2 147 483 647), чтобы обрабатывать большие числа, используя PowerShell или VBScript.
https://ss64.com/nt/set.html
Это чрезвычайно распространенная константа в компьютерах, так как мы почти все используем 32-битные int. Корреляция с простыми числами Мерсенна просто случайна из-за выбора ширины в битах
И из приведенной выше ссылки вы можете увидеть запятую как оператор-разделитель, как в языках, подобных С, а не как точку отсчета. На самом деле, я никогда не видел язык программирования, который использует запятую как точку отсчета, как в письменных языках.
,
Запятые в отдельных выражениях set /a "_num=2,_result=_num*5"
Если вы запустите set /?
, вы увидите запятую в таблице приоритетов
The /A switch specifies that the string to the right of the equal sign
is a numerical expression that is evaluated. The expression evaluator
is pretty simple and supports the following operations, in decreasing
order of precedence:
() - grouping
! ~ - - unary operators
* / % - arithmetic operators
+ - - arithmetic operators
<< >> - logical shift
& - bitwise and
^ - bitwise exclusive or
| - bitwise or
= *= /= %= += -= - assignment
&= ^= |= <<= >>=
, - expression separator
Это означает, что 1037950429,999999999*60
- это просто 2 выражения, одно со значением 1037950429 и одно с 999999999 * 60, которое переполняет 32-битное целое и возвращает отрицательное значение, как вы видите
C:\Users\>set /a 1037950429,999999999*60
-129542204
C:\Users\>set /a 999999999*60
-129542204
C:\Users\>set /a 1037950429,99999999*60
1705032644
C:\Users\>set /a 99999999*60
1705032644
C:\Users\>set /a 1037950429.999999999*60
Missing operator.
Однако в Windows уже есть команда для обратного отсчета: timeout
. Нет причин для повторной реализации этого, если вы не хотите больше контролировать его
Обратите внимание, что set a = b
в пакете означает присвоение строки b
с пробелом перед переменной %a %
. Пробелы являются значительными в команде set
, поэтому не рекомендуется использовать пробелы вокруг оператора =
. См