

-----------------------------------

nobody

13 Feb 2024 14:03



-----------------------------------

Un pic mai simplu, asta depinde de cum interpreteaza compilatorul, microprocesorul doar executa codul generat de compilator.
Logica mie mi-ar dicta ca nu are de ce sa functioneze ce am facut eu, pentru ca rezultatul impartirii il atribui unui numar float, deci nu vad de ce numerele de dinainte nu ar putea sa fie int.
Cel mai sigur imi scapa modul in care microprocesorul executa, de fapt, operatia de impartire.

Disclaimer, din nou: Nu sunt programator de meserie, n-am mai pus mana pe cod din liceu, de peste 10 ani. Go easy on me :D

Daca faci o atribuire de genul
float_c = int_a / int_b
compilatorul (implicit dupa primul operand int_a) face impatirea ca intregi si pe urma atribuie rezultatul intreg la float

Daca vrei un rezultat in float trebuie sa-i spui explicit sa trasforme primul operand in float
float_c = (float)int_a / int_b

In schimb daca primul operand este deja float, nu mai este nevoie de casting (dar nici nu strica):
float_c = float_c / int_b;

Am facut un exemplu mai jos cu uint16_t ca sa se vada si un overflow.


#include <stdio>
#include <stdint>

int main()
{

uint16_t int_a = 100000;
uint16_t int_b = 7;
float float_c;

float_c = int_a / int_b; 
printf ("int overflow:             int_a = %6i  int_b = %i  float_c = %18.12f\n", int_a, int_b, float_c);

int_a = 100;
float_c = int_a / int_b;
printf ("implicit int division:    int_a = %6i  int_b = %i  float_c = %18.12f\n", int_a, int_b, float_c);

float_c = (float)int_a / int_b; // type casting to float
printf ("explicit float division:  int_a = %6i  int_b = %i  float_c = %18.12f\n", int_a, int_b, float_c);

float_c = 100;
float_c = float_c / int_b;
printf ("implicit float division:  int_a = %6i  int_b = %i  float_c = %18.12f\n", int_a, int_b, float_c);

    return 0;
}

main.c: In function &#8216;main&#8217;:
main.c:15:18: warning: unsigned conversion from &#8216;int&#8217; to &#8216;uint16_t&#8217; {aka &#8216;short unsigned int&#8217;} changes value from &#8216;100000&#8217; to &#8216;34464&#8217; [-Woverflow]
   15 | uint16_t int_a = 100000;
      |                  ^~~~~~

int_a overflow (100000)   int_a =  34464  int_b = 7  float_c =  4923.000000000000
implicit int division:    int_a =    100  int_b = 7  float_c =    14.000000000000
explicit float division:  int_a =    100  int_b = 7  float_c =    14.285714149475
implicit float division:  int_a =    100  int_b = 7  float_c =    14.285714149475


