Сравнение int64_t с int64_t возвращает 0, когда ожидается 1

Я пытаюсь написать простую функцию, которая находит минимум в массиве:

int64_t *array_int_min(int64_t *array, size_t size)
{

    int64_t mx = 2;
    mx = (mx << 63) - 2;
    int64_t *mx_pointer = NULL;

    for (size_t i = 0; i < size; i++)
    {
        if (*(array + i) <= mx)
        {
            mx = *(array + i);
            mx_pointer = array + i;
        }
    }

    return mx_pointer;
}

И вызываю ее, например, так:

int64_t arr[5] = {2, 2, 10, 1, 5};
int64_t *m_p = array_int_min(arr, 5);

Она, неожиданно, возвращает NULL. Я подцепил отладчик и обнаружил, что условие

(*(array + i) <= mx)

всегда возвращает ноль. Я искренне не понимаю, почему так происходит:

=> mx
0xfffffffffffffffe
=> *(array + i)
0x2
=> 0x2 <= 0xfffffffffffffffe
0x1
=> *(array + i) <= mx
0x0

Число в массиве явно меньше числа в переменной mx, но проверка все равно проваливается. Что я делаю не так?


Ответы (1 шт):

Автор решения: biryulin04

Как указали в комментариях, проблема была в переполнении.

int64_t mx = INT64_MAX;

Решает проблему.

→ Ссылка