为什么我的编译器试图将 signed long long 转换为 unsigned int

Why is my compiler trying to convert from signed long long to unsigned int

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_sint64singed long long

的类型定义

PHYSFS_fileLengthreturns一个PHYSFS_sint64.

所以我不明白为什么编译器会尝试从 signed long long 转换为 unsigned int 而我只是尝试将 signed long long 分配给 signed long long

当我明确键入 signed long long 而不是 PHYSFS_sint64 时,它仍然输出相同的警告

我现在是不是很傻?我不明白

这是问题[PHYSFS_fileLength(myfile)]...

您将其用作索引(或数组大小)。指数,大小是无符号的。通常(我说通常是因为我不确定所有情况),索引是 size_t 这是平台依赖的但它总是 unsigned

您没有真正提供足够的信息,但可能的解释是 size_t(用于表示您的实现支持的数组索引和大小范围的类型)是一个 32 位数量。这意味着,要使用 64 位整数(有符号或无符号)作为数组大小,您的编译器会以某种方式将其转换为 32 位。

如果这是正确的,你会发现size_tunsigned int与你的编译器是一样的(标准允许但不要求),都是32位类型(同样,允许但不是必需的)。这可能都意味着您正在使用 32 位实现。

另一种 - 但不太可能 - 的解释是你有一个错误的编译器,它不能正确处理表达式中不同大小的整数类型之间的标准转换。我说不太可能,因为具有这种错误的编译器更有可能在没有抱怨的情况下生成错误的可执行代码,而不是给出警告。