首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我的编译器试图从已签名的long转换为无符号int?

为什么我的编译器试图从已签名的long转换为无符号int?
EN

Stack Overflow用户
提问于 2015-12-14 14:21:24
回答 2查看 197关注 0票数 0

线

代码语言:javascript
复制
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_fileLength返回一个PHYSFS_sint64

因此,我不明白为什么编译器试图将signed long long转换为unsigned int,而我只是尝试将signed long long分配给signed long long

当我显式地输入signed long long而不是PHYSFS_sint64时,它仍然输出相同的警告

我现在傻了吗?我还是不明白

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-12-14 14:39:32

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

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

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

票数 2
EN

Stack Overflow用户

发布于 2015-12-14 14:22:30

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34269293

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档