10311:受检查的浮点到整数转换
题目
读入一个 double 并转换为 int,说明小数部分的处理方式以及超出 int 范围时的标准语义。
解析
有限实数转换为整数时,小数部分向零截断。例如 3.9 得到 3,-3.9 得到 -3。若截断后的值不能由目标整数类型表示,行为未定义;强制类型转换不会自动饱和到 INT_MIN 或 INT_MAX。
下面采用保守的可移植检查。严格排除转换后的两个端点,是为了不假设 double 一定能精确表示 INT_MIN 和 INT_MAX。这可能拒绝少量本可表示的边界输入,但不会把范围外的值交给转换运算符。
解析
c
#include <limits.h>
#include <math.h>
#include <stdio.h>
int main(void) {
double input;
if (scanf("%lf", &input) != 1) {
fputs("invalid input\n", stderr);
return 1;
}
if (!isfinite(input) ||
input <= (double)INT_MIN ||
input >= (double)INT_MAX) {
fputs("outside the accepted int range\n", stderr);
return 1;
}
int result = (int)input;
printf("%d\n", result);
return 0;
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22