SInt32和<<的问题

时间:2011-06-14 17:58:13

标签: objective-c int shift

我有这么简单的代码:

char data[4] = { 0x13, 0x34, 0xad, 0xff };
int s = 0;

SInt32 tmp = data[s++]<<24;
printf("tmp= %x\n",tmp);
tmp += (data[s++]<<16);
printf("tmp= %x\n",tmp);
tmp += (data[s++]<<8);
printf("tmp= %x\n",tmp);
tmp += (data[s++]); 
printf("tmp= %x\n",tmp);

我预期的输出是

tmp= 13000000
tmp= 13340000
tmp= 1334ad00
tmp= 1334adff

而不是

tmp= 13000000
tmp= 13340000
tmp= 1333ad00
tmp= 1333acff

有人可以解释一下原因吗?

1 个答案:

答案 0 :(得分:3)

至少在某些平台上运行Objective-C,chars已签名。可能他们默认签署了Objective-C。

这意味着0xad和0xff为负,因为它们有一个负号位(MSB)。

因此,不是在倒数第二行中添加255,而是实际添加-1。之前的添加同样涉及负数。

如果您将数据更改为“unsigned char”,则此行为应该消失 - 尽管第一次转换可能会变得有趣。