I coded some calculation stuff (I copied below a really simplifed example of what I did) like CASE2 and got bad results. Refactored the code like CASE1 and worked fine. I know there is an implicit cast in CASE 2, but not sure of the full reason. Any one could explain me what´s exactly happening below?
//CASE 1, result 5.5
double auxMedia = (5 + 6);
auxMedia = auxMedia / 2;
//CASE 2, result 5.0
double auxMedia1 = (5 + 6) / 2;
//CASE 3, result 5.5
double auxMedia3 = (5.0 + 6.0) / 2.0;
//CASE 4, result 5.5
double auxMedia4 = (5 + 6) / 2.0;
My guess is that /2 in CASE2 is casting (5 + 6) to int and causing round of division to 5, then casted again to double and converted to 5.0.
CASE3 and CASE 4 also fixes the problem.
The Conversion of Char to Int We can use the process of type casting to convert the character (char) data type to the int (integer) data type in C. When we are performing a conversion between these two, the resultant value would be an integer (int) data type.
The %d format specifier expects an int argument, but you're passing a double . Using the wrong format specifier invokes undefined behavior. To print a double , use %f .
In type casting, a data type is converted into another data type by a programmer using casting operator. Whereas in type conversion, a data type is converted into another data type by a compiler. 2. Type casting can be applied to compatible data types as well as incompatible data types.
Type casting refers to changing an variable of one data type into another. The compiler will automatically change one type of data into another if it makes sense. For instance, if you assign an integer value to a floating-point variable, the compiler will convert the int to a float.
To expand on Marc's (correct) answer a bit, whole numbers are interpreted as integer, whereas numbers with decimal points are interpreted as double. To declare a whole number as a literal double, append a "D" to it:
//CASE 2b, result 5.5
double auxMedia2b = (5D + 6D) / 2;
You are correct. CASE 2 uses integer arithmetic until the assignment is made. You can also fix the problem by making an explicit cast:
double auxMedia1 = ((double) (5 + 6)) / 2;
//CASE 2, result 5.0
double auxMedia1 = (5 + 6) / 2;
The result of the (5 + 6) operation is integer. Because both operands are of type integer. Then, the compiler performs 11 / 2, where both operand are also integers. The result of the last division is obviously 5, because it is an integer division (don't know the proper English word).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With