Число больше и меньше другого в пакетном файле 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

Вы также можете подумать о том, что ваш код будет делать (и должен делать), когда они равны... но я оставлю это рассмотрение в качестве упражнения для читателя.

Другие вопросы по тегам