Сравнение 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;
Решает проблему.