0

线

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是一个 typedefsinged long long

PHYSFS_fileLength返回一个PHYSFS_sint64

所以我不明白为什么当我尝试将 a 分配给 a 时编译器会尝试从signed long longto转换?unsigned intsigned long longsigned long long

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

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

4

2 回答 2

2

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

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

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

于 2015-12-14T14:39:32.453 回答
0

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

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

于 2015-12-14T14:22:30.427 回答