
変数: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でしょうか?
ご存知の方おりましたら、教えてくださいお願いします。
No.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;
}
No.3
- 回答日時:
>変数: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 ではない。
No.2
- 回答日時:
必ずしも、オフセット値の差が同じ処理ばかりという保証はありませんから、一旦物理値にする方がスマートです。
そうすると、
・Aを「物理値に変換するマクロA(関数A)」で物理値に変換
・物理値を「物理値からオフセット値に変換するマクロX(関数X)」で変換し代入
とすることで、このマクロ(関数)を変更するだけで本体の処理はそのままで使用することができ、変更漏れによるミスもなくすことができます。
特に、
>ABC(負号無し1byte)
に対して
>-40してから
と行った場合、40未満の値に対して型の変換問題が発生しやすくなります。
……と、ここまで書いて気がついたのですが、両方とも「符号なし」ですね。
単純に「-50」としたら物理値が「0~49」の時に問題が発生しませんか?
「符号あり」の間違いでは?
No.1
- 回答日時:
>この2つの変数を使って、XYZ = ABCの代入処理をする場合ですが、
>ABC=100とした時(物理値は90)
物理値の代入をしたいのですか?だとすると、
1)ABCの値を物理値に変換する(100→90)
2)ABCの物理値90をXYZに代入する
3)XYZにオフセットを履かせる(90→140)
これで、ABCのオフセット付き値(100)を
XYZのオフセット付き値(140)に代入できたことに
なりませんか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) エクセルの数式で教えてください。 2 2023/03/10 08:51
- Excel(エクセル) エクセルの数式で教えてください。 2 2023/03/09 10:07
- Excel(エクセル) エクセルの数式で教えてください。 1 2023/02/08 09:05
- Excel(エクセル) エクセルの数式で教えてください。 1 2023/03/09 14:24
- Excel(エクセル) エクセルの数式で教えてください。 2 2023/03/09 08:37
- システム科学 割合の計算式教えてください 8 2023/02/03 17:38
- 数学 …こりゃ酷すぎる。回答者諸君、しっかりしなさい。初等的な問題にはまず初等的な解法を示すべきと心得よ。 7 2022/04/11 22:00
- Visual Basic(VBA) 以下のVBAで該当文字列の前後に付与したい。 例 前に付与 abc ユーザーID 12345 後に付 3 2022/04/19 21:50
- Excel(エクセル) 列の複数ある空白セルを飛ばして、セルに並べて表示したい 3 2023/02/12 16:49
- 政治 ABC予想で自衛隊を合憲にする事ができますよね? 3 2022/04/23 05:46
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一番好きなみそ汁の具材は?
- ・泣きながら食べたご飯の思い出
- ・「これはヤバかったな」という遅刻エピソード
- ・初めて自分の家と他人の家が違う、と意識した時
- ・いちばん失敗した人決定戦
- ・思い出すきっかけは 音楽?におい?景色?
- ・あなたなりのストレス発散方法を教えてください!
- ・もし10億円当たったら何に使いますか?
- ・何回やってもうまくいかないことは?
- ・今年はじめたいことは?
- ・あなたの人生で一番ピンチに陥った瞬間は?
- ・初めて見た映画を教えてください!
- ・今の日本に期待することはなんですか?
- ・集中するためにやっていること
- ・テレビやラジオに出たことがある人、いますか?
- ・【お題】斜め上を行くスキー場にありがちなこと
- ・人生でいちばんスベッた瞬間
- ・コーピングについて教えてください
- ・あなたの「プチ贅沢」はなんですか?
- ・コンビニでおにぎりを買うときのスタメンはどの具?
- ・おすすめの美術館・博物館、教えてください!
- ・【お題】大変な警告
- ・洋服何着持ってますか?
- ・みんなの【マイ・ベスト積読2024】を教えてください。
- ・「これいらなくない?」という慣習、教えてください
- ・今から楽しみな予定はありますか?
- ・AIツールの活用方法を教えて
- ・最強の防寒、あったか術を教えてください!
- ・歳とったな〜〜と思ったことは?
- ・モテ期を経験した方いらっしゃいますか?
- ・好きな人を振り向かせるためにしたこと
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBAでダブルコーテーション入り...
-
jsp~jspにhiddenを使って変数...
-
C言語 列挙型(enum型)変数について
-
stdpicture型の変数に、、
-
[VBS]変数を定数に変換する方法...
-
EXCEL/VBA 変数の値をクリップ...
-
テキストボックスの値を変数に...
-
C言語 アロー演算子について質...
-
VBA 1行で複数の代入を行った...
-
整数xxxが大き過ぎますというエ...
-
プログラミングで変数と関数の...
-
代入ができない。(undefined)
-
C言語 exitで終了した関数の戻...
-
エラーの意味は? Lvalue req...
-
i++と++i ってどう違うのですか?
-
7行テトリスコードで分からな...
-
VB6.0での条件文にある#の意味
-
C言語 exitの使い方
-
フォームを開くときに、コンボ...
-
vbsでテキストファイル内の文字...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAでダブルコーテーション入り...
-
エラーの意味は? Lvalue req...
-
jsp~jspにhiddenを使って変数...
-
EXCEL/VBA 変数の値をクリップ...
-
[VBS]変数を定数に変換する方法...
-
Variant型で宣言してるのにEmpt...
-
テキストボックスの値を変数に...
-
java 乗算をシフト演算と加算を...
-
整数xxxが大き過ぎますというエ...
-
C言語 アロー演算子について質...
-
processing エラーで、 "cannot...
-
gridViewの行選択解除
-
C言語 列挙型(enum型)変数について
-
vba 最大値 条件分岐
-
datagridviewに行...
-
プログラミングで変数と関数の...
-
stdpicture型の変数に、、
-
Accessコンボボックスにレコー...
-
JavaScriptをURLから直接実行し...
-
Excel VBAでイコール二回使えま...
おすすめ情報