如何在C语言中将size_t转换为int?

3

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

我知道size_t是无符号的,但在需要int表示的情况下,我们该怎么办呢?


没有安全的转换方式,只能使用强制类型转换。 - Vlad from Moscow
在将 size_t 强制转换为 int 之前,您可以通过检查其范围来安全地进行转换。如果它超出了有效的 int 范围,则无法进行转换。 - Weather Vane
在将其转换之前,请对 INT_MAX 进行测试以确保没有可能出现有符号整数溢出。 如果测试通过,则只需进行强制转换并运行即可。 - WhozCraig
这个回答解决了你的问题吗?如何安全地将int转换为size_t? - Govind Parmar
1个回答

8
在C99中,将类型为size_t的变量安全地转换为int类型是可能的吗?这取决于你对“安全性”的理解。类型size_t的最大表示值通常比int类型的最大表示值大。如果你想知道是否可以在不丢失信息的情况下将所有size_t值转换为int类型,那么对于你的实现来说,答案可能是“不行”,而在可移植性方面,则肯定是“不行”的。如果你想知道是否可能检测到size_t值太大而无需尝试执行显式转换,以避免实现定义的结果和可能信号在值超出范围并回退到某种优雅失败的情况下,则答案是“是”。你可以安全地将涉及的值与INT_MAX进行比较。适当的值保持转换将自动应用于将<=或>运算符的操作数带到公共类型,并且该操作将产生适当的结果。
我知道size_t是无符号的,但在需要int表示的情况下,我们该怎么办?如果你只是询问语法,假设你想要转换的值总是可以表示为int类型,那么你可以使用强制转换(int x; x =(int)my_size_t_value;),但在某些情况下你实际上不需要做任何事情。特别地,在这种情况下,你可以直接将size_t分配给int变量,或直接将其传递给具有区域原型的非可变参数函数的int参数,在这些情况下,适当的转换将自动执行。

1
在我的情况下,这个答案解决了构建中的一些“警告”。(this->total_cases = (int) this->cases_database.rows(); - emgf_co

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接