- ベストアンサー
変数にオフセットが付いている時の計算について
変数:ABC(負号無し1byte)は「-10」のオフセットがついてます。 (0の時-10という値を表す) 変数:XYZ(負号無し1byte)には「-50」のオフセットがついてます。 (0の時-50という値を表す) この2つの変数を使って、XYZ = ABCの代入処理をする場合ですが、 ABC=100とした時(物理値は90)XYZにこのまま代入すると 物理値は50になってしまうので、XYZのオフセット分に合わせこむ為、 ABCの変数に「40」を加算し「140」にしてから代入すれば良いのでしょうか? 又、ABC = XYZ をやる場合は逆に-40してから代入すればOKでしょうか? ご存知の方おりましたら、教えてくださいお願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
オフセット値がくせ者ですね。ただし、ここでは符号無し1バイトということですから、データタイプは unsigned char ということになり、オフセット値はマイナス(-)の符号を用いることはできません。すなわち、+オフセット値をとります。 ここでは、オフセット値を先にセットしてから代入を行っていますが abc = 値; ではなく abc += 値; ・・・(1) の加算による代入としています。 そして abc を用いた xyz への代入は xyz = abc; ではなく、オフセット値を配慮した (1) と同じ xyz += abc - OFFSET_A; ・・・(2) の加算による代入としています。 OFFSET_A は、(2) で配慮していますが、(1) の段階で配慮しても構いません。いずれも、物理値を xyz に渡すようにすることです。OFFSET_Aを (1) にもってくるか (2) にもってくるかは、あなたが理解し易い方を選べば良いのではないでしょうか。 #include <stdio.h> #define OFFSET_A 10 #define OFFSET_X 50 #define reset(a,b) {a = OFFSET_A; b = OFFSET_X;} int main(void) { unsigned char abc, xyz, temp; /* 各オフセットの設定 */ reset(abc, xyz); /* 表示読みの代入 */ printf("表示abc(%d)? ", OFFSET_A); scanf("%d", &temp); abc += temp; xyz += abc - OFFSET_A; printf("xyz: 表示.%d - オフセット.%d = 物理量.%d\n", xyz + OFFSET_X, OFFSET_X, xyz); reset(abc, xyz); printf("表示xyz(%d)? ", OFFSET_X); scanf("%d", &temp); xyz += temp; abc += xyz - OFFSET_X; printf("abc: 表示.%d - オフセット.%d = 物理量.%d\n", abc + OFFSET_A, OFFSET_A, abc); return 0; }
その他の回答 (3)
- yama5140
- ベストアンサー率54% (136/250)
>変数:ABC(負号無し1byte)は「-10」のオフセットがついてます。 ABC: 0 から 255 ← 「負号無し1byte」 「物理値」: 10 から 265 と読めますが、 >(0の時-10という値を表す) ABC: 0 から 255 ← 「負号無し1byte」 「物理値」: -10 から 245 オフセットしない値が -10 では、「+10」のオフセット、ではないですか。 ★引用した2行は、矛盾していませんか。 >ABC=100とした時(物理値は90) 前述後者の「 + 」のオフセット、ですね。← ABC = 90 + ( +10 ) = 100 以降、おそらく質問者様の意に反して?「 + 」のオフセット、でアドバイス。 ---------------------------------------------------------- (「物理値」は、小文字表記しています) >XYZ = ABCの代入処理をする場合・・ xyz + ( +50 ) = abc + ( +10 ) ですよね。 ★abc = 90 のとき、xyz は 50 となり、XYZ, ABC は 100 のまま( XYZ = ABC )。 プログラム的にしてみると、 #define BIAS (10) #define ABC_OFF(i) (i+BIAS) // ((i+BIAS+256)%256) abc = 90; // 「種」となる値 = オフセットしない値 ABC = ABC_OFF( abc ); XYZ = ABC; これで、ABC は 100 となり、XYZ も当然・・。 >ABC = XYZ をやる場合は逆に-40してから代入すればOKでしょうか? ・「 - 」のオフセットの場合は、「-40してから代入すればOK」です。 abc + ( +10 ) = xyz + ( +50 ) から、abc = xyz + 40 ・「 + 」のオフセットの場合は、「+40してから代入すればOK」です。 プログラム的にしてみると、 #define BIAS (50) #define XYZ_OFF(i) (i+BIAS) xyz = 200; 例えばの値 XYZ = XYZ_OFF( xyz ); ABC = XYZ; これで、ABC は、250 になる・・。 ★ abc は、250 - ( +10 ) で 240 → 200 に「+40してから代入」と同じ。 注意:「+-40して」云々で、「求める」ものは「物理値」であり、ABC ではない。
- SilverThaw
- ベストアンサー率32% (260/806)
必ずしも、オフセット値の差が同じ処理ばかりという保証はありませんから、一旦物理値にする方がスマートです。 そうすると、 ・Aを「物理値に変換するマクロA(関数A)」で物理値に変換 ・物理値を「物理値からオフセット値に変換するマクロX(関数X)」で変換し代入 とすることで、このマクロ(関数)を変更するだけで本体の処理はそのままで使用することができ、変更漏れによるミスもなくすことができます。 特に、 >ABC(負号無し1byte) に対して >-40してから と行った場合、40未満の値に対して型の変換問題が発生しやすくなります。 ……と、ここまで書いて気がついたのですが、両方とも「符号なし」ですね。 単純に「-50」としたら物理値が「0~49」の時に問題が発生しませんか? 「符号あり」の間違いでは?
- asuncion
- ベストアンサー率33% (2127/6289)
>この2つの変数を使って、XYZ = ABCの代入処理をする場合ですが、 >ABC=100とした時(物理値は90) 物理値の代入をしたいのですか?だとすると、 1)ABCの値を物理値に変換する(100→90) 2)ABCの物理値90をXYZに代入する 3)XYZにオフセットを履かせる(90→140) これで、ABCのオフセット付き値(100)を XYZのオフセット付き値(140)に代入できたことに なりませんか?