Objective c SInt32和<&书信电报;

Objective c SInt32和<&书信电报;,objective-c,int,shift,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++

我有一段简单的代码:

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= 1333ad00
tmp= 1333acff

有人能解释一下原因吗?

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

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

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


如果您将数据更改为“unsigned char”,这种行为应该会消失——尽管第一次转换可能会很有趣。

是的,经过短暂的调试,我找到了相同的解决方案。:)
tmp= 13000000
tmp= 13340000
tmp= 1333ad00
tmp= 1333acff