olala
olala

Reputation: 4446

data type: float, long conversion in C

I was reading C primer plus, in chapter 3, data type, the author says:

If you take the bit pattern that represents the float number 256.0 and interpret it as a long value, you get 113246208.

I don't understand how the conversion works. Can someone helps me with this? Thanks.

Upvotes: 0

Views: 1113

Answers (3)

Alexey Frunze
Alexey Frunze

Reputation: 62048

256.0 is 1.0*28, right?

Now, look at the format (stealing it from @bash.d):

31                             0
|                              |
SEEEEEEEEMMMMMMMMMMMMMMMMMMMMMMM //S - SIGN , E - EXPONENT, M - MANTISSA

The number is positive, so 0 goes into S.

The exponent, 8, goes into EEEEEEEE but before it goes there you need to add 127 to it as required by the format, so 135 goes there.

Now, of 1.0 only what's to the right of the point is actually stored in MMMMMMMMMMMMMMMMMMMMMMM, so 0 goes there. The 1. is implied for most numbers represented in the format and isn't actually stored in the format.

The idea here is that the absolute values of all nonzero numbers can be transformed into

    1.0...1.111(1) * 10some integer (all numbers are binary)

or nearly equivalently

    1.0...1.999(9) * 2some integer (all numbers are decimal)

and that's what I did at the top of my answer. The transformation is done by repeated division or multiplication of the number by 2 until you get the mantissa in the decimal range [1.0, 2.0) (or [1.0, 10.0) in binary). Since there's always this 1 in a non-zero number, why store it? And so it's not stored and gives you another free M bit.

So you end up with:

(0 << 31) + ((8 + 127) << 23) + 0 = 1132462080

The format is described here.

Upvotes: 3

bash.d
bash.d

Reputation: 13207

While integer and long values are usually represented using two's complement, float-values have a special Encoding, because you cannot tell the computer to display a float-value only using bits. A 32-bit float number contains a sign-bit, a mantisse and an exponent. These determine together what value the float has.
See here for an article.

EDIT

So, this is what a float encoded by IEEE 754 looks like (32-bit)

31                             0
|                              |
SEEEEEEEEMMMMMMMMMMMMMMMMMMMMMMM //S - SIGN , E - EXPONENT, M - MANTISSE

I don't know the pattern for 256.0, but the long value will be purely interpreted as

31                             0
|                              |
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB // B - BIT

So there is no "conversion", but a different interpretation.

Upvotes: 1

Mppl
Mppl

Reputation: 961

What's important from that quote is that integer/long and floats are saved in a different format in memory, so that you cannot simply pick up a bit of memory that has a float in it and say that now it's an int and get a correct value.

The specifics on how each data type is saved into memory can be found searching for IEEE standard, but again that isn't probably the objective of the quote. What it tries to tell you is that floats and integers are saved using a different pattern and you cannot simply use a float number as an int or vice-versa.

Upvotes: 3

Related Questions