Максимумы времени в оболочке Windows и почему? - PullRequest
0 голосов
/ 13 января 2019

Я сделал простой обратный отсчет в Windows Batch Scripting :

@ECHO OFF
MODE con: cols=13 lines=2
COLOR 4f
TITLE Countdown Timer
SET /p m=? Minutes:
SET /a s = 60 * m
FOR /l %%a in (%s%,-1,1) do (
  ECHO %%a/%s%
  PING -n 2 127.0.0.1 >NUL 2>&1
  CLS
)
IF ERRORLEVEL 1 EXIT
CSCRIPT alert.vbs
EXIT

и я заметил следующие вещи:

  1. максимум секунд , который я могу использовать, это ровно восьмое простое число Мерсенна: 2147483647 ( 2147483647 секунд до лет в DuckDuckGo ) , но
  2. Если я использую множитель 60 для запуска обратного отсчета с минут , максимально допустимое целое число составляет 1037950429.99999999.

Проведение моего исследования, чтобы понять , почему (?) , заставило меня задать этот вопрос.

windows command calculations

1 Ответ

0 голосов
/ 13 января 2019

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, поэтому не рекомендуется использовать пробелы вокруг оператора =. См

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...