线
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是singed long long的类型
PHYSFS_fileLength返回一个PHYSFS_sint64。
因此,我不明白为什么编译器试图将signed long long转换为unsigned int,而我只是尝试将signed long long分配给signed long long
当我显式地输入signed long long而不是PHYSFS_sint64时,它仍然输出相同的警告
我现在傻了吗?我还是不明白
发布于 2015-12-14 14:39:32
您还没有提供足够的信息,但可能的解释是,size_t (用于表示实现所支持的数组索引和大小范围的类型)是32位数量。这意味着,要使用64位整数(有符号与否)作为数组大小,编译器将以某种方式将其转换为32位。
如果这是正确的,您将发现编译器中的size_t和unsigned int是相同的(标准允许但不需要),两者都是32位类型(同样,这是允许的,但不是必需的)。这可能意味着您使用的是32位实现。
另一种解释(但极不可能)是,您有一个错误的编译器,它不能正确地处理表达式中不同大小的整数类型之间的标准转换。我说不太可能,因为具有这种缺陷的编译器更有可能产生错误的可执行代码,而不是发出警告。
发布于 2015-12-14 14:22:30
问题是[PHYSFS_fileLength(myfile)]..。
您正在使用它作为索引(或数组大小)。索引、大小没有签名。通常(我通常说,因为我不确定所有的情况),索引是size_t,它是平台可靠的,但它总是unsigned。
https://stackoverflow.com/questions/34269293
复制相似问题