2016-04-08 9 views
2

私はpic32mxコントローラとC32ツールスイートv2.02コンパイラとMPLAB-X IDE v 3.05を使用して作業しています。 long long変数でビット単位の操作を使用していますが、誤った結果が得られています。長いビットのビット操作エラー

int main() 

{ 

    long long data0, data1=0; 

    data0 = 489631651402; 
    data1 = data0 & 0x0FFFFFFFFFF; 

    printf("%llu\n%llu\n", data0, data1); 

    return 0; 
} 

OUTPUT:

489631651402 

    492260348528 

計算によれば、この結果は誤りです。 data0とdata1は等しくなければなりません。

この操作を改善する方法を教えてください。上記の手順でエラーが発生した場合は、正しい経路を提案してください。

+0

生成されたアセンブリコードを確認しましたか? –

+3

それで、あなたがビットごとに定数を持っていくと*が大きくなりますか?うーん...それは普通はあまりできない。私はあなたがこれをもう一度確認し、16進数で数字を印字しないようにして、少し分かりやすくすることをお勧めします。さらに、Joachimが削除された答えで言ったように、なぜそれがなくなったのか分かりません。 – unwind

+0

このコードで唯一の問題は、符号付きの値を持つ '%llu'指定子を使用することです。私はそれがこのエラーを引き起こすだろうとは思わない。 – interjay

答えて

-1

すべてのビットにマスクが必要な場合は、定数としてULLONG_MAXを使用します。これらの48ビットのみをマスクする必要がある場合は、0x30FFFFFFFF LLを使用してください。

+0

'ULLONG_MAX'は常に' 0x0FFFFFFFFFF'以上です。その値は何にも等しくなることは保証されていません(下限のみです)ので、とにかく使うのは良い考えではありません。 – interjay

+0

ビット単位でANDされたオブジェクトはlong long型です。 – GMichael

+0

私はそれが分かっていますが、なぜそれが 'ULLONG_MAX'が' 0x0FFFFFFFFFF'の良い代替品だと考えるのか説明していません。 – interjay