「お昼の放送」の思い出

変数: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でしょうか?

ご存知の方おりましたら、教えてくださいお願いします。

A 回答 (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_A10
#define OFFSET_X50
#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;
}
    • good
    • 0

>変数: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 ではない。
    • good
    • 0

必ずしも、オフセット値の差が同じ処理ばかりという保証はありませんから、一旦物理値にする方がスマートです。


そうすると、
・Aを「物理値に変換するマクロA(関数A)」で物理値に変換
・物理値を「物理値からオフセット値に変換するマクロX(関数X)」で変換し代入
とすることで、このマクロ(関数)を変更するだけで本体の処理はそのままで使用することができ、変更漏れによるミスもなくすことができます。

特に、
>ABC(負号無し1byte)
に対して
>-40してから
と行った場合、40未満の値に対して型の変換問題が発生しやすくなります。
……と、ここまで書いて気がついたのですが、両方とも「符号なし」ですね。
単純に「-50」としたら物理値が「0~49」の時に問題が発生しませんか?
「符号あり」の間違いでは?
    • good
    • 0

>この2つの変数を使って、XYZ = ABCの代入処理をする場合ですが、


>ABC=100とした時(物理値は90)

物理値の代入をしたいのですか?だとすると、
1)ABCの値を物理値に変換する(100→90)
2)ABCの物理値90をXYZに代入する
3)XYZにオフセットを履かせる(90→140)

これで、ABCのオフセット付き値(100)を
XYZのオフセット付き値(140)に代入できたことに
なりませんか?
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報