This is the mail archive of the
gcc-help@gcc.gnu.org
mailing list for the GCC project.
Problem with cast from double to unsigned short int
- From: "Gederberg, Thomas K" <Thomas dot K dot Gederberg at boeing dot com>
- To: "gcc-help at gcc dot gnu dot org" <gcc-help at gcc dot gnu dot org>
- Date: Wed, 14 Apr 2010 13:31:36 -0500
- Subject: 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))))