1バイトデータ型を1バイトを超えて左シフトするとどうなる?
C言語の話。
1バイトしかないデータ型の変数の値を1バイト以上 左ビットシフトしたらどうなるか?
例えば、以下の様に。
unsigned char a = 1;
printf("0x%x, %d\n", (a << 24), sizeof((a << 24));
unsigned charは1バイトで、3バイト分 左ビットシフトするので、変数の範囲1バイトを超える。
でも、シフト演算した結果を変数に入れてないので、被演算変数のデータ型に影響されるのかされないのかとか、結果のデータ型が何になるのか知らないと、1バイトの結果しか得られないと思ってしまうんじゃない?
左ビットシフト演算に限らず、演算結果は整数型として扱われる。上の例の場合はint型で扱われる。なので結果は ”0x1000000, 4” となる。
C言語仕様の話で、ちょっと説明が面倒。
JPCERTコーディネーションセンター のここのページに詳しく書かれているので一読されたし。
む、ここ、C言語のセキュアコーディングの事が書いてあるんだけど、なかなか良いな。読んでおこう。
演算によらず、列挙型(enum)や数字定数(#define)なども整数型として扱われるので覚えておいた方がいざというとき役に立つぜ。
« サラリーマンNEO シーズン5をやっていたのか | トップページ | 今日届いたもの »
コメント