本当は言語としては未定義なのですが、主要なコンパイラは論理シフト演算として実装しているようです。gccとclangでは論理シフトしました。
#include <stdio.h>
int main()
{
// 1byteのsigned charで検証
signed char signed_1;
signed char signed_2;
//0b接頭辞で2進数を表現できる
signed_1 = 0b01010000; // -> 80
signed_1 = signed_1 << 1; // -96(0b10100000)
printf("sigined_1: %d\n", signed_1);
signed_2 = 0b10111111; // -> -65
signed_2 = signed_2 << 1; // 126(0b01111110)
printf("signed_2: %d\n", signed_2);
}
算術シフトのつもりでビットシフトするとハマりますね。
ちなみに、右シフトはちゃんと算術シフトされます。
あなたのお役に立てれば嬉しいです。