Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

iphone: floats cast to unsigned ints get set to 0 if they are negative?

try it out:

volatile float bob = -344.0f;
unsigned int fred = (unsigned int)bob;

printf("%d\n",fred);

output will be 0.

obviously I am expecting it to wrap around just as if I had cast from a signed int to an unsgined int (which does wrap and act as expected on the iphone)

we assume it is something to do with the floating point settings.

any ideas?

like image 450
matt Avatar asked Mar 22 '10 07:03

matt


2 Answers

This is to be expected - casting a negative float to an unsigned int results in undefined behaviour (UB). If you want the value to wraparound (which is also UB, BTW), then you would need to cast to a (signed) int first and then to unsigned int. Ideally you should not rely on UB at all and find a better way of doing what you need to do.

like image 97
Paul R Avatar answered Oct 09 '22 00:10

Paul R


§6.3.1.4 of the C standard:

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 like Paul R said, this is undefined behavior.

like image 22
Stephen Canon Avatar answered Oct 08 '22 23:10

Stephen Canon