• ベストアンサー

変数にオフセットが付いている時の計算について

変数: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_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)
回答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」の時に問題が発生しませんか? 「符号あり」の間違いでは?

全文を見る
すると、全ての回答が全文表示されます。
  • asuncion
  • ベストアンサー率33% (2126/6288)
回答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

  • 変数名

    変数名を $abc1 $abc2・・・・ 繰り返し文などで生成することは可能でしょうか? そして、変数に値を代入したいのですが・・・。 if(a==true){$abc1 = "OK"} if(a==true){$abc2 = "OK"} if(a==true){$abc3 = "OK"}      ・      ・      ・      ・      ・      ・ このような文は繰り返し文では無理ですか??

    • 締切済み
    • PHP
  • 【再確認】C言語のcharとvarcharの扱い

    すみません、前回も似たような質問をしましたが、再確認させてください。 例えば、変数1はサイズが256、型がvarchar、値がabcで、変数2はサイズが20、型がcharの場合、 変数1から変数2には値を直接代入できますか? また、代入できた場合、変数2の値はabc+スペース17桁になりますか? 逆に変数2の値がabcの場合、変数2から変数1には直接代入できますか? また、代入できた場合、変数2の値はabc(後ろにスペース等なし)になりますか?

  • 外部jsファイルの変数に代入するには?

    初心者ですがjavascriptについて質問です。 なんらかの値を外部ファイル内の変数に代入させることは可能なのでしょうか? うまく説明できませんが・・・ あるjsファイル内の文字をリンク先の外部jsファイル内の変数の中に入れたいです。 <例> abc.js の中にある文字列"○○○" ↓ abc.jaから <a href="xyz.js">にリンク ↓ xyz.js の中の var xxx ="○○○" に、したいのですが・・・説明が下手ですみません。 わかる方是非教えてください。

  • binファイルが軽くなる変数への代入処理について

    変数に値を代入する方法はいろいろあるかと思いますが、 コンパイル後に最もバイナリファイルが軽くなる処理はどのような処理でしょうか。 例として、1000バイトのデータを変数に代入する際、 (1)直接一つずつ代入する。 data[0] = 0x00; data[1] = 0x00; ・・・ data[999] = 0x00 (2)変数の定義時に代入(初期化)を行う。 unsigned char data[1000] = {0x00,0x00,・・・・0x00} 等ありますが、どちらの処理が有効でしょうか。 また、その他有効な処理方法等がありましたら、ご教授願います。 グローバル変数として定義するか、かローカル変数として定義するか、 defineで代入値を持つ等、定義時の方法でも違いがありましたら、 教えて頂けると助かります。

  • フラグメントオフセットについて

    フラグメントオフセットについて 識別番号とフラグメントオフセットでパケットの再組み立てをしてると思うのですが 識別番号は、同じデータには同じ値で、まずそのデータが同じデータかどうか判断する。 そしてフラグメントオフセットは、パケットがそのデータの何バイト目かを値で、13bit x 8分の値(フラグメントオフセットの1ビットが8ビット分表すため)を表現できると勉強しました。 しかし、13bit X 8 以上のデータなら、そのあとどのような処理があるのでしょうか? 回答お願いします。

  • Perlで変数中のエスケープされた特殊文字を展開

    Perlで、変数に既に格納されているエスケープされた特殊文字を、もとの文字に展開するには どのようにしたらよいでしょうか。 つまり、\t という値で格納されているのをタブ文字にしたり、\\ という値であれば\の一文字に するという事です。 ダブルクォートで定義すれば展開されると思いましたが、展開は変数の代入時に行われるだけで、 既に変数中にエスケープされて入っているものはダブルクォートを使い変数を囲んだりしても展開されません。 下記は簡単な例でやろうとしてる事を示したものです。 add変数に\tというタブを意味するエスケープされた特殊文字を含んでいるとして、その\tを タブとして展開し、abc defのようにさせたいのですが、abc\tdefと入ってしまいます。 $ cat unescape.pl #!/bin/perl $add = '\tdef'; #シングルクォートで代入すると、もちろんエスケープされたまま代入される #$add = "\tdef"; #ダブルクォートで代入すると代入時にタブへ展開される #$add = $ARGV[0]; #本当はAGRVからエスケープ特殊文字を含んだ文字列を取りたい。ARGVから代入すると、シングルクォートの時のようにそのまま代入される $tgt = 'abc'; print "add: " . $add , "\n"; print "before: " . $tgt . "\n"; $tgt .= "$add"; #既にエスケープされた形で代入されているものを、ダブルクォートで囲んで使っても展開されない print "after: " . $tgt . "\n"; $ perl unescape.pl add: \tdef before: abc after: abc\tdef

    • ベストアンサー
    • Perl
  • セレクトボックスで現在選択されている値

    下記のセレクトボックスがあります。  print "<select name='atai'>";  print "<option value='abc'>abc</option>";  print "<option value='123'>123</option>";  print "<option value='xyz'>xyz</option>";  print "</select>"; 現在、選択されている値を $int の変数に入力 したいのですが、どうしたらいいのでしょうか。 例えば、$int=・・・・・・; というふうに代入 文でできることなのでしょうか。   この場合、現在表示されているCGIで、 $int が、abc か 123 か xyz か知りたい のです。

    • ベストアンサー
    • Perl
  • オフセットの数値入力

    AutoCADLT2000の質問です。 わかりにくいかもしれませんが よろしくお願いしますm(_ _)m オフセットの値が整数÷2の場合は そのままの値でオフセットしてくれるのですが、 オフセットの値が小数点÷2の時に きちんとしたオフセットの値が出てくれません。 (その前に入力した値になります) 例) オフセット100/2=50 オフセット80.5/2=50 どこか小数点の設定ができるとこがあるのでしょうか?

  • バイナリファイル(画像等)データをオフセットして読み込みたい

    タイトル見ただけではなんのこっちゃかもわかりませんが 行いたい事は以下の通りです。 バイナリファイル(画像ファイル)、仮に15Kバイトのサイズだったとします。 それを10Kバイト区切りで読み込みたい。 そして変数$str1,$str2に格納したい。 open(BIN, "< test.gif"); binmode(BIN); #ファイルの先頭から10Kバイト読み込んで変数$str1に代入 sysread(BIN, $str1, 10000); #上記で読み込んだ個所から、残りのデータを読み込みたい #オフセット10Kバイトから5Kバイト読み込む sysread(BIN, $str2, 5000,10000); close(BIN); のような処理でいいのかと思っていたのですが、 $str2には期待通りの形で格納されませんでした。 先頭の10000バイト(オフセットで指定したサイズ)がNULLになっており、 その先から残りのバイナリデータが格納されていました。 自分が行いたいのは、 $str2の先頭から、バイナリファイルのオフセットの値 (ここでは10Kの部分からのこりの5K) を格納したいのです。 この関数ではダメだと思うのですが、 自分の行いたい処理の関数が見当たらず困っております。 どなたかご存知の方、どうぞよろしくお願い致します。

    • ベストアンサー
    • Perl
  • EXCEL2010 VBA 変数への代入

    EXCEL2010のVBAを使用しています。 処理で繰り返しの処理があります。 繰り返しのたびに変数Aに変数A+セルの番地(A1等)を代入していきたいのですがうまくいきませんどうすればよいでしょうか? 説明が下手ですみません。 ようするに変数の中の値を上書きせずに、現在の値を後ろに追加したいということです。 (例) 変数Bは最初は「1」 繰り返し1回目  変数A =変数A&Cells(1,変数B)   ’変数Bは繰り返しのたびに1ずつ増えます 繰り返し2回目  変数A =変数A&Cells(1,変数B) 一回目は変数AにはA1が入る 2回目の処理時にはA1B1というふうになり、上書きされず追加で代入される。 というようなイメージです。