我正在尝试调试一段遗留代码。该代码对于最多 9 位数字的值运行良好,但对于大于 9 位的数字的值开始抛出奇怪的错误。我知道这与类型转换有关,但我不知道是什么原因。
这是代码:
int a = 0;
char numbuff[15] = "999999999"; //nine digits long works
printf("%s\n",numbuff);
printf("%f\n",atof(numbuff));
a = atof(numbuff) / 1; //I think they are dividing by 1 to cast to int?
printf("%d\n",a);
当我使用九位数字运行此程序时numbuff
,我得到了预期的结果:
999999999
999999999.000000
999999999
但是当我将其设置为 10 位数字来运行它时numbuff
,我得到了以下结果:
9999999999
9999999999.000000
2147483647
所以我想我不太理解为什么原始代码要将浮点数除以 1。我以为是将浮点数转换为整数,但对于数字超过 9 位的数字,这不起作用。
我相信代码使用 atof() 而不是 atoi() 是为了摆脱 numbuff 字符串中的空格,这是有意义的(因为 numbuff 用于许多不同的数字长度)。
因此乍一看这段代码似乎有意义,但它却不起作用。
发生了什么事?我该如何修复此代码以使其适用于更长的数字?
除以 1 不会转换为
int
。当表达式结合int
和 时double
,int
会转换为double
,结果为double
。编写代码的人可能对除法的作用有自己的误解。将结果赋值回
int
变量a
就是将其转换为int
。明确地说,赋值相当于:由于除以
1.0
没有效果,因此它也等同于:您得到 10 位数字的奇怪结果的原因是您超出了 的可能值
int
。如果int
是 32 位,则最大值为 2,147,483,647。更改
a
为long
(并使用%ld
作为printf
格式),您将获得期望的结果,最高可达 9,223,372,036,854,775,807(尽管这超出了 的精度double
,大约为 17 位数字,因此您将在转换中丢失低位数字atof()
)。