Conversion to short from char, odd results?
So my code has in it the following:
开发者_JS百科unsigned short num=0; num=*(cra+3); printf("> char %u\n",num);
cra is a char*
The problem is that it is getting odd output, sometimes outputting numbers such as 65501 (clearly not within the range of a char). Any ideas?
Thanks in advance!
Apparently *(cra+3)
is a char
of value '\xdd'
. Since a char
is signed, it actually means -35 (0xdd
in 2's complement), i.e. 0x...fffffdd. Restricting this to 16-bit gives 0xffdd, i.e. 65501.
You need to make it an unsigned char
so it gives a number in the range 0–255:
num = (unsigned char)cra[3];
Note:
1. the signedness of char
is implementation defined, but usually (e.g. in OP's case) it is signed.
2. the ranges of signed char
, unsigned char
and unsigned short
are implementation defined, but again commonly they are -128–127, 0–255 and 0–65535 respectively.
3. the conversion from signed char
to unsigned char
is actually -35 + 65536 = 65501.
char
is allowed to be either signed or unsigned - apparently, on your platform, it is signed.
This means that it can hold values like -35. Such a value not within the range representable by unsigned short
. When a number out of range is converted to an unsigned type, it is brought into range by repeatedly adding or subtracting one more than the maximum value representable in that type.
In this case, your unsigned short
can represent values up to 65535, so -35 is brought into range by adding 65536, which gives 65501.
unsigned short has a range of (at least) 0 .. 65535 (link), the %u format specifier prints an unsigned int with a range of (commonly) 0 .. 4294967295. Thus, depending on the value of cra, the output appears to be completely sensible.
cra
is just a pointer.
It hasn't been allocated any space, by way of malloc
or calloc
. So its contents are undefined . *(cra + 3)
will evaluate to the contents of the location 3 bytes ahead of the location cra
(assuming char
occupies 1 byte). I believe that its contents are also undefined.
unsigned short
takes up 2 bytes, atleast on my system. Hence it can hold values from 0
to 65536
. So, your output is within its defined range
精彩评论