2011-06-14 121 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