This is the mail archive of the gcc-help@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Problem with cast from double to unsigned short int


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 Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]