Arduinoのサンプルスケッチを見ていたときに、自分自身の「思い込み」にはまったので、メモ。
#include <stdio.h>
int main(void)
{
char a = 1;
printf("sizeof(a) = %d\n", sizeof(a));
printf("sizeof(a << 4) = %d\n", sizeof(a << 4));
return 0;
}
を実行すると、
% ./a.out
sizeof(a) = 1
sizeof(a << 4) = 4
となる。
うっかり、char型に収まる範囲でのビットシフトでは型が変化しないと思い込んでしまったが、整数拡張は起こる。
参考: https://www.jpcert.or.jp/sc-rules/c-int02-c.html
整数拡張は通常の算術型変換の一部として、引数式や、単項 +、-、~演算子, シフト演算子のオペランドに対して適用される。