2011-06-14 126 views
2

我有了这个简单的代码:问题的SINT32和<<

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 

有人五月解释我为什么?

回答

3

至少在一些平台上运行Objective-C,chars被签名。可能它们默认情况下是用objective-C签名的。

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

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

如果您将数据更改为“无符号字符”,此行为应该消失 - 尽管第一次移位可能会变得有趣。

+0

是的,经过短暂的调试,我到达了相同的解决方案。 :) – Saphrosit 2011-06-14 18:26:15