2

私はこの単純なコードを持っています:

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

誰かが私に理由を説明してもらえますか?

4

1 に答える 1

3

少なくとも一部のプラットフォームでは、Objective-Cが実行され、文字が署名されます。おそらく、それらはデフォルトでObjective-Cでサインインされています。

これが意味するのは、0xadと0xffは負の符号ビット(MSB)を持っているため、負であるということです。

したがって、最後から2番目の行に255を追加する代わりに、実際には-1を追加します。前の加算も同様に負の数を含みます。

データを「unsignedchar」に変更すると、この動作はなくなるはずです。ただし、最初のシフトは興味深いものになる可能性があります。

于 2011-06-14T18:17:05.873 に答える