Estou tentando depurar um pedaço de código legado. O código funciona bem para valores de até 9 dígitos, mas começa a lançar erros estranhos para valores maiores que 9 dígitos. Sei que tem algo a ver com a conversão de tipo, mas não consigo descobrir o que.
Este é o código:
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);
Quando executo isso usando numbuff
nove dígitos, obtenho o resultado esperado:
999999999
999999999.000000
999999999
Mas quando executo usando numbuff
o conjunto de 10 dígitos, obtenho este resultado:
9999999999
9999999999.000000
2147483647
Então acho que não estou entendendo muito bem por que o código original está dividindo o float por 1. Pensei que era para converter o float em um int, mas não funciona para números com mais de 9 dígitos.
Acredito que o código esteja usando atof() em vez de atoi() para se livrar de espaços em branco na string numbuff, o que faz sentido (já que numbuff é usado para muitos comprimentos numéricos diferentes).
Então, à primeira vista, esse código parece fazer sentido, mas não está funcionando.
O que está acontecendo e como posso consertar esse código para que funcione com números maiores?
Dividir por 1 não converte para
int
. Quando uma expressão combinaint
edouble
, oint
é convertido paradouble
, e o resultado é adouble
. Quem escreveu o código provavelmente tinha sua própria concepção errada sobre o que a divisão faz.Atribuir o resultado de volta à
int
variávela
é o que o converte paraint
. Tornando tudo isso explícito, a atribuição é equivalente a:Como dividir por
1.0
não tem efeito, também é equivalente a:O motivo de você estar obtendo resultados estranhos para 10 dígitos é que você está excedendo os valores possíveis de
int
. Seint
for 32 bits, o valor máximo é 2.147.483.647.Mude
a
paralong
(e use%ld
comoprintf
formato) e você obterá o resultado esperado, até 9.223.372.036.854.775.807 (embora isso exceda a precisão dedouble
, que é de cerca de 17 dígitos, então você perderá dígitos de ordem baixa naatof()
conversão).