Линия
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
это все еще выводит то же самое предупреждение
Я сейчас тупой? Я не понимаю
Вы действительно не дали достаточно информации, но вероятное объяснение состоит в том, что size_t
(тип, используемый для представления диапазона индексов и размеров массивов, поддерживаемых вашей реализацией) — это 32-разрядная величина. Это означает, что для использования 64-разрядного целого числа (со знаком или без) в качестве размера массива ваш компилятор каким-то образом преобразует его в 32-разрядное.
Если это правильно, вы найдете, что size_t
а также unsigned int
с вашим компилятором то же самое (что стандарт разрешает, но не требует), и оба типа 32-битные (которые, опять же, разрешены, но не обязательны). Что, вероятно, означает, что вы используете 32-битную реализацию.
Альтернативное, но крайне маловероятное объяснение состоит в том, что у вас есть глючный компилятор, который неправильно обрабатывает стандартные преобразования между целочисленными типами разных размеров в выражениях. Я говорю маловероятно, так как компилятор с такой ошибкой с большей вероятностью будет генерировать некорректный исполняемый код без хулиганства, а не предупреждать об этом.
Вот проблема [PHYSFS_fileLength(myfile)]
…
Вы используете его как индекс (или размер массива). Индексы, размеры без знака. Обычно (я сказал обычно, потому что я не уверен во всех случаях), индексы size_t
который зависит от платформы, но это всегда unsigned