Почему мой компилятор пытается конвертировать из длинных подписанных длинных в целые без знака

Линия

std::unique_ptr<PHYSFS_sint64> myBuf(new PHYSFS_sint64[PHYSFS_fileLength(myfile)]);

выдает предупреждение

warning C4244: 'initializing' : conversion from 'PHYSFS_sint64' to 'unsigned int', possible loss of data

PHYSFS_sint64 является typedef для singed long long

PHYSFS_fileLength возвращает PHYSFS_sint64,

Так что я не понимаю, почему компилятор пытается конвертировать из signed long long в unsigned int когда я просто пытаюсь назначить signed long long к signed long long?

Когда я явно набираю signed long long вместо PHYSFS_sint64 это все еще выводит то же самое предупреждение

Я сейчас тупой? Я не понимаю

0

Решение

Вы действительно не дали достаточно информации, но вероятное объяснение состоит в том, что size_t (тип, используемый для представления диапазона индексов и размеров массивов, поддерживаемых вашей реализацией) — это 32-разрядная величина. Это означает, что для использования 64-разрядного целого числа (со знаком или без) в качестве размера массива ваш компилятор каким-то образом преобразует его в 32-разрядное.

Если это правильно, вы найдете, что size_t а также unsigned int с вашим компилятором то же самое (что стандарт разрешает, но не требует), и оба типа 32-битные (которые, опять же, разрешены, но не обязательны). Что, вероятно, означает, что вы используете 32-битную реализацию.

Альтернативное, но крайне маловероятное объяснение состоит в том, что у вас есть глючный компилятор, который неправильно обрабатывает стандартные преобразования между целочисленными типами разных размеров в выражениях. Я говорю маловероятно, так как компилятор с такой ошибкой с большей вероятностью будет генерировать некорректный исполняемый код без хулиганства, а не предупреждать об этом.

2

Другие решения

Вот проблема [PHYSFS_fileLength(myfile)]

Вы используете его как индекс (или размер массива). Индексы, размеры без знака. Обычно (я сказал обычно, потому что я не уверен во всех случаях), индексы size_t который зависит от платформы, но это всегда unsigned

0

По вопросам рекламы [email protected]