C言語のシフトについて

シフト演算子 ">>" は算術シフトなのか?それとも論理シフトなのか?

という疑問がふと沸いたので調べてみた。

#include<stdio.h>

int main(void) {
    int si          = -1;
    unsigned int ui = -1;
    printf("%d\n", si);
    printf("%u\n", ui);
    printf("%d\n", si >> 31);
    printf("%d\n", ui >> 31);
    return 0;
}

結果

 -1
 4294967295
 -1
 1

結論:

int の場合は算術シフト

unsigned int の場合は論理シフトとなる。

(処理系によって違うかも?)


おまけ - リテラルの場合

#include<stdio.h>

int main(void) {
    printf("%d\n", -1 >> 31);
    return 0;
}

結果

-1

算術シフトでした。

(結果はすべてcodepadによるもの。)