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
有人可以解释我为什么吗?     
已邀请:
        在至少某些运行Objective-C的平台上,对char进行了签名。默认情况下,它们可能在Objective-C中签名。 这意味着0xad和0xff为负,因为它们具有负符号位(MSB)。 因此,您实际上不是在倒数第二行添加255,而是在添加-1。前一个加法类似地涉及一个负数。 如果将数据更改为“未签名字符”,则此行为应消失-尽管第一个转变可能会变得有趣。     

要回复问题请先登录注册