Dúvida com cálculo e declaração de números em C

1. Dúvida com cálculo e declaração de números em C

Nick Us
Nick-us

(usa Slackware)

Enviado em 26/07/2020 - 05:48h

Eu cai no problema quando precisei fazer a seguinte conta: Multiplicar 1953521664 x 512. Esses números são: Qtd de Setores do meu Hd x Tamanho do Setor.
O resultado disso é 1000203091968 = 931.5G. Mas nem eu mesmo tenho certeza se esse número está completo 1000203091968

Tentei fazer isso na calculadora Mate e ela deu 1.000203091968×10¹² o que me deixou super confuso e me fez perder a confiança na calculadora Mate, nem no meu celular consegui calcular isso! Então busquei na Internet uma calculadora que me desse o resultado de forma simples e normal, mas também já nem mais acreditava nesses resultados!

Então resolvi fazer um programa em C que me desse o resultado! Então meu problema aumenta porque descobri mais dúvida em C.

1º PROBLEMA: Eu havia anotado que

int = números inteiros de -32768 a 32767
long int = -65536 a 65535
signed long int = -2.147.483.648 a 2.147.483.647
long int = -2.147.483.648 a 2.147.483.647
unsigned long int = 4.294.967.295

Meu Número = 1.953.521.664 // Pelo que entendi cai na faixa dos "long int"
Mas o Resultado? = 1.000.203.091.968 // Muito acima de todas as faixas acima, e agora?

E agora? Como vou declarar se o resultado que preciso é muito maior que esses? Sem saber o que fazer declarei assim mesmo para tentar calcular!
#include <stdio.h>
int main(void) {
int sectors1 = 1953521664; // Aceitou declarar, imprime normal, como isso é possível?
int size = 512;
int Result1 = sectors1 * size;
printf("%d\n", sectors1); // OK, mostra o valor correto! Eu acreditei que estava tudo bem mas não está!
printf("%d\n", Result1); // -524288000 Não funciona? Limitação do int?

unsigned long int Result2= sectors1 * size;
printf("%lu\n", Result2); // 18446744073185263616 Parece que não funciona!

// Forma que deu algum resultado!
unsigned long int sectors3 = 1953521664;
unsigned long int Result3= sectors3 * size;
printf("%lu\n", Result3); // OK 1000203091968

long int sectors4 = 1953521664;
long int Result4= sectors4 * size;
printf("%lu\n", Result4); // OK 1000203091968
return 0;
}

Repare acima que só consegui resultados nos long, imaginando que o resultado esteja correto né?

DÚVIDAS: O Resultado que tenho é correto? Como pode o long int dar um resultado maior do que ele aparentemente pode suportar? E se eu precisar calcular um número maior que isso? Porque 2 bilhões parece um número bem pequeno, como calcularia 10 bilhões ou trilhões se eu tiver essa necessidade?

No Código acima comentado ainda mais dúvidas! Alguém sabe esclarecer? Alguém saberia calcular um número maior que o meu com resultado normal sem potência e etc...?


  


2. Re: Dúvida com cálculo e declaração de números em C

Stanislaus K
StanislausK

(usa FreeBSD)

Enviado em 26/07/2020 - 09:05h

Ola,

"1º PROBLEMA: Eu havia anotado que"

eu aprendi:

short int (16 bits) = -32768 a 32767
unsigned short int (16 bits) = 0 a 65.535
int (32 bits) = -2.147.483.648 a 2.147.483.647
unsigned int (32 bits) = 0 a 4.294.967.295
long int (64 bits) = -9 × 10^18 a aprox. 9 × 10^18
unsigned long int (64 bits) = 0 até aprox. 18 × 10^18
float (32 bits) = aprox. 10^-38 a aprox. 10^38
double (64 bits) = aprox. 10^-308 a aprox. 10^308

Pode ser visto aqui também:
https://pt.cppreference.com/w/cpp/language/types

"Muito acima de todas as faixas acima, e agora? "

as faixas mencionadas acima por você estão incorretas...


3. Re: Dúvida com cálculo e declaração de números em C

Mauricio Ferrari
mauricio123

(usa Slackware)

Enviado em 26/07/2020 - 09:12h


Eu usaria:

unsigned long int

___________________________________
Conhecimento não se Leva para o Túmulo.


4. Re: Dúvida com cálculo e declaração de números em C

Nick Us
Nick-us

(usa Slackware)

Enviado em 26/07/2020 - 10:54h

mauricio123 escreveu:
Eu usaria:
unsigned long int

Pois é, no exemplo que mostro tanto ele quanto o signed funcionam, mas será que funcionariam com números maiores? Na casa de trilhões sem dar algum problema?



5. Re: Dúvida com cálculo e declaração de números em C

Mauricio Ferrari
mauricio123

(usa Slackware)

Enviado em 27/07/2020 - 10:53h


Nick-us escreveu:

mauricio123 escreveu:
Eu usaria:
unsigned long int

Pois é, no exemplo que mostro tanto ele quanto o signed funcionam, mas será que funcionariam com números maiores? Na casa de trilhões sem dar algum problema?


é dificil dizer. só testando para saber.

___________________________________
Conhecimento não se Leva para o Túmulo.






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner
Linux banner
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts