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

时间:2015-12-14 14:21:25

标签: c++ type-conversion physfs

该行

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

的typedef

PHYSFS_fileLength会返回PHYSFS_sint64

所以当我尝试将signed long long分配给unsigned int时,我不明白为什么编译器会尝试从signed long long转换为signed long long?< / p>

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

我现在傻了吗?我不明白

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:0)

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

您正在将其用作索引(或数组的大小)。指数,大小未签名。通常(我说通常是因为我不确定所有情况),索引是size_t,它是平台可靠的,但总是unsigned