Problem with cast from double to unsigned short int

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



I am having an interesting problem when casting from double to an unsigned short int as shown in the following example:.  

#include <stdio.h>

int main()
{
   unsigned short int ius;
   unsigned short int ous;
   short int is;

   ius = 52536;

   is = (short int) ((double)(ius));

   ous = (unsigned short int) is;

   printf("ius = %hu\n", ius);
   printf("is  = %d\n", is);
   printf("ous = %hu\n", ous);
}

Using a Sun CC compiler and Microsoft Visual C++ for 32-bit, the above code generates:

ius = 52536
is  = -13000
ous = 52536

which is as I would expect.  The two's complement of 52536 is -13000.

However, when compied using gcc (version 3.2.3, also confirmed with gcc 4.4.1) with the -m32 option specifed, the code produces:

ius = 52536
is  = -32768
ous = 32768

Is this a bug with gcc?  Also, if I don't cast ius to (double) before casting to (short int), I get what I expect.  Can anyone explain?

Thanks!

Note: this problem popped up in some code I am trying to port from Solaris to Linux.  The code includes the following macro:
#define REAL_TO_SHORT_BIT_TYPE(X) ((unsigned short int) ((short int) ((double) (x))))


[Index of Archives]     [Linux C Programming]     [Linux Kernel]     [eCos]     [Fedora Development]     [Fedora Announce]     [Autoconf]     [The DWARVES Debugging Tools]     [Yosemite Campsites]     [Yosemite News]     [Linux GCC]

  Powered by Linux