Arduinoと気圧計を使っていて参考にしたコードでは結果がおかしかったのでメモ。。
I2Cから取得した三つの数値(a,b,c)をa*256*256+b*256+cと計算する際、
シフト演算を使っていたのだけど、結果がおかしかった。
で、下記のコード作って実験。
long var;
I2Cから取得した三つの数値(a,b,c)をa*256*256+b*256+cと計算する際、
シフト演算を使っていたのだけど、結果がおかしかった。
で、下記のコード作って実験。
long var;
void setup() {
// put your setup code here, to run once:
byte i=B01100000;
Serial.begin(9600);
var = i << 8;
Serial.println(var);
var = var << 8;
Serial.println(var);
var = var << 8;
Serial.println(var);
var = i << 16;
Serial.println(var);
}
void loop() {
// put your main code here, to run repeatedly:
}
の実行結果(シリアル出力)・・・
24576
6291456
1610612736
0
の実行結果(シリアル出力)・・・
24576
6291456
1610612736
0
どうも元の変数がlong以外だと演算後の数値の枠として2Byte(-32768〜32767)しかもってないようだ。
シフト演算後の結果が範囲を超えそうなときは、一度型変換が必要。こんな感じ。
var = (long) i << 16;
結果は
6291456


