32031


<https://github.com/ARMmbed/mbed-events/blob/master/equeue/equeue.c>  
のequeue_clampdiff()という関数に、下記のコードがあるのですが、

[code]

    return ~(diff >> (8*sizeof(int)-1)) & diff;
    
[/code]

この処理の意図していることがわかりません。sizeof(int) ==
4の環境が前提だと思うので、diffは常に31ビット右シフトすることになります。それを反転して&。何が何やら・・・。


CC BY-SA 3.0
2017-01-20T17:16:05.787
32029
2017-01-20T18:35:09.990
17238
question
c
mbed-events equeue_clampdiff()の実装について


負の数を右シフトしたときの動作は未規定で、コンパイラによって違っていても構わないのですが、算術右シフトにしている処理系が多いようなので、ここでもそうだと仮定します。

結論からいうと、`diff` が正または 0 なら、そのまま返し、負だったら 0 を返す、というのが意図だと思います。

算術右シフトは一番左の符号ビットを残したままシフトしていきます。`8*sizeof(int)-1` は、int のビット数 - 1
なので、その分、右にシフトすると、全てのビットが符号ビットと同じになります。つまり正の数なら 0、負の数なら全てのビットが 1 (0xFFFFFFFF)
になります。これを反転して & すれば、結論のようになります。


CC BY-SA 3.0
2017-01-20T18:35:09.990
32031
2017-01-20T18:35:09.990
3605
32029
answer