Проблема с SInt32 и << - PullRequest
       31

Проблема с SInt32 и <<

2 голосов
/ 14 июня 2011

У меня есть этот простой кусок кода:

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 Ответ

3 голосов
/ 14 июня 2011

По крайней мере, на некоторых платформах Objective-C работает, символы подписаны.Возможно, они подписаны в target-C по умолчанию.

Это означает, что 0xad и 0xff являются отрицательными, поскольку они имеют бит отрицательного знака (MSB).

Поэтому вместо добавления 255во второй-последней строке вы фактически добавляете -1.Предыдущее добавление также включает отрицательное число.

Если вы измените данные на «unsigned char», это поведение должно исчезнуть - хотя это первое смещение может оказаться интересным.

...