【问题标题】:How to convert size_t to int in C?如何在 C 中将 size_t 转换为 int?
【发布时间】:2020-10-19 21:05:08
【问题描述】:

是否可以在 C99 中安全地将 size_t 类型的变量转换为 int 类型?

我很欣赏size_t 未签名,但如果我们需要int 表示,我们能做什么?

【问题讨论】:

  • 没有安全的转换。只需使用投射。
  • 您可以安全地将size_t 转换为int,方法是在转换之前检查其范围。如果它超出有效的int 范围,则不能。
  • 对 INT_MAX 进行测试,以确保在强制转换之前没有可能的有符号整数溢出。如果成功了,只需投射并运行它。
  • 这能回答你的问题吗? How can I convert to size_t from int safely?

标签: c c99


【解决方案1】:

是否可以安全地将 size_t 类型的变量转换为类型 C99 中的 int?

这取决于您所说的“安全”。

size_t 类型的最大可表示值 通常大于int 类型的最大可表示值。如果您询问是否可以将所有 size_t 值转换为类型 int 而不会丢失信息,那么对于您的实现,答案可能是“否”,在可移植性意义上肯定是“否”。

如果您询问是否可以检测到size_t 值对于int 类型而言太大而无需实际尝试执行显式转换,以避免实现定义的结果和可能的信号如果值超出范围并退回到某种优雅的失败,那么答案是“是”。您可以安全地将有问题的值与INT_MAX 进行比较。将自动应用适当的保值转换以将 <=> 运算符的操作数转换为通用类型,并且该操作将产生适当的结果。

我很欣赏未签名的 size_t,但在我们需要一个 int 表示,我们能做什么?

如果您只是询问语法,假设您要转换的值将始终可以表示为类型int,那么您可以转换 (int x; x = (int) my_size_t_value;),但实际上您不需要做任何事情在某些情况下根本没有。特别是,您可以直接将size_t 分配给int 变量,或者直接将其传递给具有范围内原型的非可变函数的int 参数,在这些情况下,适当的转换将是自动执行。

【讨论】:

  • 在我的情况下,这个答案解决了构建中的一些warnings。 (this->total_cases = (int) this->cases_database.rows();)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-18
  • 2011-12-10
  • 1970-01-01
相关资源
最近更新 更多