从char转换为short,奇怪的结果?

时间:2010-10-02 14:55:33

标签: c

所以我的代码中包含以下内容:

unsigned short num=0;
num=*(cra+3);
printf("> char %u\n",num);

cra是一个char *

问题在于它输出奇数,有时会输出数字,如65501(显然不在char范围内)。有什么想法吗?

提前致谢!

4 个答案:

答案 0 :(得分:6)

显然*(cra+3)是价值char的{​​{1}}。由于'\xdd'已签名,因此实际上意味着-35(2的补码中为char),即0x ... fffffdd。将其限制为16位给出0xffdd,即65501。

您需要将其设为0xdd,因此它会给出0-255范围内的数字:

unsigned char

<子> 注意:
1. num = (unsigned char)cra[3]; 的签名是实施定义的,但通常(例如在OP的情况下)签署 2. charsigned charunsigned char的范围是实现定义的,但通常它们分别是-128-127,0-255和0-65535。
3.从unsigned shortsigned char的转换实际上是-35 + 65536 = 65501.

答案 1 :(得分:2)

char可以是已签名或未签名 - 显然,在您的平台上,已签名。

这意味着它可以保存-35之类的值。这样的值不在unsigned short所代表的范围内。当超出范围的数字转换为无符号类型时,通过重复添加或减去一个超过该类型中可表示的最大值的范围,将其带入范围。

在这种情况下,您的unsigned short可以表示最大值为65535的值,因此通过添加65536将-35置于范围内,得到65501.

答案 2 :(得分:0)

cra只是一个指针。

尚未通过malloccalloc分配任何空格。所以它的内容是未定义的。 *(cra + 3)将评估位置cra之前3个字节的位置内容(假设char占用1个字节)。我相信它的内容也是未定义的。

unsigned short占用2个字节,至少在我的系统上。因此,它可以保存从065536的值。因此,您的输出在其定义的范围内

答案 3 :(得分:0)

无符号短的范围为(至少) 0 .. 65535 link),%u 格式说明符打印 unsigned int ,其范围为(通常) 0 .. 4294967295 。因此,根据 cra 的值,输出似乎是完全合理的。