我有时在过去使用的是更大的数据类型,然后当我转换为更小的类型时,立即转换回更大的类型并检查值是否没有改变.
例如,假设你使用的是int64_t,那么你可能会有类似的东西:
int64_t my_pid64;
/* ... parse string value into my_pid64 ... */
pid_t my_pid = (pid_t) my_pid64;
if ((int64_t) my_pid != my_pid64) /* check that value was not out of range of pid_t */
{
/* ... handle error ... */
}
Run Code Online (Sandbox Code Playgroud)
没有很好的选择可以使用更大的数据类型."long"曾经是最大的原始整数数据类型,但在某些常见的编译器/体系结构上却不是这样 - 即使对于Linux(参见下面的注释).同时,intmax_t类型的库支持较差.结果是int64_t有时在实践中更有用.
但是,基本上您对较大数据类型的选择可能很长,int64_t和intmax_t.
blksize_t、pid_t 和 ssize_t 应为有符号整数类型。
和:
该实现应支持一种或多种编程环境,其中 blksize_t、pid_t、size_t、ssize_t 和 suseconds_t 的宽度不大于 long 类型的宽度。
因此,您可以将用户字符串转换为 pid_tlong类型,然后使用 来检查 pid_t 类型是否溢出long pid; .. pid == (pid_t)pid。