What conversion happens in the following expression?

In the following expression, what conversion happens?

long long a;
long long b;
double c;
b=a*c;

suppose the long long type is 8-byte.

If a and b are both int, then in the expression b = a * c, a will be converted to double and does multiplication with c, and the result will be converted to int and assigned to b.

Is my assumption correct?

Answers


b=a*c;

is equivalent to:

b=(long long) ( (double)a * c );

So there are two conversions involved, first from long long to double and second from double result to long long

For more details check this page from Joachim Pileborg's comment


As per C11 standard, chapter ยง6.3.1.8, Usual arithmetic conversions

....Otherwise, if the corresponding real type of either operand is double, the other operand is converted, without change of type domain, to a type whose corresponding real type is double.

So, your statement is essentially,

b= (long long)( (double)a * c );

that is, for the * operand, c is double, so value of a is converted to a double value, the multiplication is performed, the result is of type double and finally, that value is being converted to long long, when assigned to b, as per the type of b itself.


According to the C Standard (6.3.1.8 Usual arithmetic conversions)

1 Many operators that expect operands of arithmetic type cause conversions and yield result types in a similar way. The purpose is to determine a common real type for the operands and result....This pattern is called the usual arithmetic conversions:

...

Otherwise, if the corresponding real type of either operand is double, the other operand is converted, without change of type domain, to a type whose corresponding real type is double

And (6.5.16 Assignment operators)

  1. The type of an assignment expression is the type the left operand would have after lvalue conversion.

and (6.5.16.1 Simple assignment)

2 Insimple assignment (=), the value of the right operand is converted to the type of the assignment expression and replaces the value stored in the object designated by the left operand.

Thus in this statement

b = a * c;

at first object a is converted to type double and the evaluated right operand has type double. After that the value of the right operand is converted to the type of the assignment expression that has the type of the left operand that is the result of a * c is converted to long long int.

Take into account that even if c is equal to 1 expression a * c is not necessary equal to a * 1 due to the conversions

Consider the following program

#include <stdio.h>
#include <limits.h>

int main( void )
{
    long long a = LLONG_MAX;
    long long b;
    double c = 1;

    printf( "a = %lld\n", a );
    printf( "c = %lf\n", c );

    b = a * c;

    printf( "b = %lld\n", b );
}    

The program output might look like

a = 9223372036854775807
c = 1.000000
b = -9223372036854775808

Need Your Help

avalondock mvvm

mvvm datacontext avalondock

Using avalondock seems to be fairly challenging in a MVVM environment. As soon as I detach a DocumentPane from the shellview, I loose the corresponding datacontext and my view is empty. When reatta...

Push up keyboard on screen

android actionscript-3 flash keyboard

I have a problem with my Flash App on Android, this app requires installing Adobe Air on Android before running. The keyboard pushing issue has troubled me for a while however I can't find a soluti...