C言語における数値のシフト演算


C言語における数値はシフト演算を実現できるが,数値が符号なし(unsigned)と符号付き(signed)に分かれているため,この2つの数値演算方式は異なる.
符号なし数値の演算は簡単で、一言まとめるとシフトとゼロ補正ですが、符号数値のシフトがある場合は注意が必要です.
数値が記号がある場合、左シフトであればシフトと補零であるため、正の数はシフトによって負の数またはゼロになることができる.しかし、右に移動すると、違います.符号数があり、論理右シフトが発生するか、算術右シフトが発生する可能性があるため、C規格では、論理右シフトを使用するか算術右シフトを使用するかを明確に指定していない.しかし、多くの機械は算術右シフトを使用しており、シフトとゼロ補正である.しかし、これは多くの機械がそうであることを言っているだけで、あなたは自分が特別な状況に遭遇しないことを保証することができますか? 
しかし、注意しなければならないことがあります.
つまり、私たちがシフトしたとき、高位損失が発生した場合、これはシステムが数値の長さを拡張しようとすることです.次の例を参照してください.
#include <stdio.h>

int main(void)
{
        char a = -128;

        printf("%d 
",a<<1); return 0; }

実行結果は-256ですが、char型のデータのデフォルトは記号の最小である-128です.どうして-256があるのでしょうか.これは、システムがaを左に1ビット移動すると高位損失が発生する可能性があることを発見したため、自動的にデータを拡張し、以下のように修正した.
#include <stdio.h>

int main(void)
{
        char a = -128;
        char b = a<<1;  

        printf("%d 
",b); return 0; }

これは、システムが数値を拡張しようとすると、char型のbに結果を付与し、暗黙的な数値型変換が発生し、bが結果の8ビット未満しか得られないため、実行結果が0である.