所以我的代码中包含以下内容:
unsigned short num=0; num=*(cra+3); printf("> char %u\n",num);
cra是一个char *
问题在于它输出奇数,有时会输出数字,如65501(显然不在char范围内)。有什么想法吗?
提前致谢!
答案 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. char
,signed char
和unsigned char
的范围是实现定义的,但通常它们分别是-128-127,0-255和0-65535。
3.从unsigned short
到signed char
的转换实际上是-35 + 65536 = 65501.
答案 1 :(得分:2)
char
可以是已签名或未签名 - 显然,在您的平台上,已签名。
这意味着它可以保存-35之类的值。这样的值不在unsigned short
所代表的范围内。当超出范围的数字转换为无符号类型时,通过重复添加或减去一个超过该类型中可表示的最大值的范围,将其带入范围。
在这种情况下,您的unsigned short
可以表示最大值为65535的值,因此通过添加65536将-35置于范围内,得到65501.
答案 2 :(得分:0)
cra
只是一个指针。
尚未通过malloc
或calloc
分配任何空格。所以它的内容是未定义的。 *(cra + 3)
将评估位置cra
之前3个字节的位置内容(假设char
占用1个字节)。我相信它的内容也是未定义的。
unsigned short
占用2个字节,至少在我的系统上。因此,它可以保存从0
到65536
的值。因此,您的输出在其定义的范围内
答案 3 :(得分:0)
无符号短的范围为(至少) 0 .. 65535 (link),%u 格式说明符打印 unsigned int ,其范围为(通常) 0 .. 4294967295 。因此,根据 cra 的值,输出似乎是完全合理的。