2011-12-22 5 views
3

したがって、私はcharを長くしてから、クリアして、もう一度やり直しています。シフトが15になると私のマシンは変わってしまいます。コードのコメントを見てください。あなたはこれを引き起こしていると思いますか?Cビットシフトの奇数の結果が左に15ビットシフトした

このマシンのchar 0x00で、そして長い0000 0000

unsigned char temp; 
    unsigned long open_code; 

    temp = 0x01; 
    open_code = open_code | (temp <<1);// open_code = 0x0000 0002 
    open_code = 0; 
    //......  
    // 2 - 7  
    //.... 
    temp = 0x01; 
    open_code = open_code | (temp <<8); // open_code = 0x0000 0100 
    open_code = 0; 
    temp = 0x01; 
    open_code = open_code | (temp <<9); // open_code = 0x0000 0200 
    open_code = 0; 
    temp = 0x01; 
    open_code = open_code | (temp <<10); // open_code = 0x0000 0400 
    open_code = 0; 
    temp = 0x01; 
    open_code = open_code | (temp <<11); // open_code = 0x0000 0800 
    open_code = 0; 
    temp = 0x01; 
    open_code = open_code | (temp <<12); // open_code = 0x0000 1000 
    open_code = 0; 
    temp = 0x01; 
    open_code = open_code | (temp <<13); // open_code = 0x0000 2000 
    open_code = 0; 
    temp = 0x01; 
    open_code = open_code | (temp <<14); // open_code = 0x0000 4000 
    open_code = 0; 
    temp = 0x01; 
    open_code = open_code | (temp <<15); // open_code = 0xFFFF 8000 !!!!! 
    open_code = 0; 
    temp = 0x01; 
    open_code = open_code | (temp <<16); // open_code = 0x0000 0000 !!!!! 
+0

は、あなたがそれをシフト、長い最初にコピー文字を試してみましたか? –

+0

私には完全に「正常」に見えます。 Cのさまざまなキャスティングルールの相互作用(しばしば難解です)。 –

+0

あなたはどのプラットフォームにいますか? –

答えて

2

あなたはあまりにも遠くunsigned charをシフトし、オーバーフローを誘発する結果としてしているように見えます。そのように、シフト前longにキャストしてみてください。

open_code = open_code | (((long)temp) <<15); 
+0

okシフトは内部の温度の中で起こっていますか?それは理にかなっている。 – eagletusk

+0

@ user2758:私はそれが起こっていると言っても間違いないと思います_inside_ 'temp'。実際、あなたは正しいかもしれませんが、私の答えは間違っているかもしれません。 'temp'をもっと大きなタイプにする必要があるかもしれません! –

+1

tempは、シフト演算子が実行される前にintに昇格されます。問題はおそらくintに関連して署名されているが、私はなぜ私の頭を包んでいない。 –

関連する問題