Число больше и меньше другого в пакетном файле Windows
У меня есть следующий код в моем командном файле:
if %bakfilesize% geq %freespacet% echo baksize is larger
if %bakfilesize% leq %freespacet% echo baksize is smaller
Когда я запускаю его, я получаю следующий вывод на экран:
if 399502220288 GEQ 463777075200 echo baksize is larger
baksize is larger
if 399502220288 LEQ 463777075200 echo baksize is smaller
baksize is smaller
Кто-нибудь может сказать мне, что здесь происходит? Я пробовал простую версию с номерами 1 и 2, и окна могут подтвердить, что 1 действительно меньше 2, так почему же в этом случае происходит сбой?
Мне действительно нужно только выражение geq для работы. Другой, чтобы продемонстрировать странность.
2 ответа
Хорошо, в этом случае проблема довольно проста. Попробуйте это как в вашем примере:
set /a bakfilesize=399502220288
Вы получите эту ошибку:
Неправильный номер. Числа ограничены 32-битной точностью.
Таким образом, это означает, что числа, с которыми вы работаете, слишком велики, и DOS не сможет их сравнивать.
Оба числа, которые вы указали в своем примере, слишком велики, чтобы поместиться в 32-битные целые числа. У меня нет ссылки для подтверждения, но это совсем не удивительно, если CMD.EXE использует 32-битную целочисленную арифметику со знаком.
463777075200 is 0x6BFB449000
399502220288 is 0x5D04301C00
Если эти значения усечены до 32 бит CMD, то большее значение будет выглядеть как отрицательное число (0xFB449000 равно -79392768) и действительно меньше, чем меньшее значение, которое остается положительным при усечении (0x04301C00 равно 70261760).
В первоначальном вопросе он был отредактирован, чтобы исправить очевидную ошибку, которую вы поменяли местами, а также оператор сравнения. Пытаться:
if %bakfilesize% geq %freespacet% echo baksize is larger
if %bakfilesize% leq %freespacet% echo baksize is smaller
Вы также можете подумать о том, что ваш код будет делать (и должен делать), когда они равны... но я оставлю это рассмотрение в качестве упражнения для читателя.