Kami Kaze
Kami Kaze

Reputation: 2080

storing a big float into an integer (cast and no cast)

What does the standard (are there differences in the standards?) say about assigning a float number out of the range of an integer to this integer?

So what should happen here, assuming 16 bit short, to keep the number small (USHRT_MAX == 65535)

float f = 100000.0f;
short s = f;
s = (short) f;
unsigned short us = f;
us = (unsigned short) f;

Upvotes: 2

Views: 32

Answers (1)

M.M
M.M

Reputation: 141618

This is undefined behaviour (with no diagnostic required). See C11 6.3.1.4 (earlier standards had similar text):

When a finite value of real floating type is converted to an integer type other than _Bool, the fractional part is discarded (i.e., the value is truncated toward zero). If the value of the integral part cannot be represented by the integer type, the behavior is undefined.

So, assuming your system has USHRT_MAX as 65535, short s = f; and all subsequent lines cause undefined behaviour.

Upvotes: 5

Related Questions