int型(2バイト)データの分割
マイコンのフラッシュ領域にint型のデータ(2バイト)を
1バイトづつ書き込むのに以下のコードを考えています。
unsigned int data;
unsigned char dat1,dat2;
data = 555;
dat1 = 0;
dat2 = 0;
dat1 = (char)data;
dat2 = (char)data >> 8;
以下、dat1とdat2をフラッシュに書き込む。
未熟者でプログラムとして合っているのか解りません。
やり方として問題ないでしょうか?
またもっと良い方法があればご教授願います。
No.6ベストアンサー
- 回答日時:
まず考えるべきは、フラッシュメモリの書き込んだデータは誰が使うのか? です。
自分(というか、そのシステム)だけでしか使わないのであれば、余り気にすることはありません。
この場合だと、
data = 555; に対して、
dat1 = data % 0x100;
dat2 = data / 0x100;
が一番安全でしょう。
右辺はいずれも int のサイズで計算されて、代入の際に、(数値として)下の桁から、char 分が代入されます。
※代入の直前までは、int で計算されることに注意。
読み出しの場合は、
data = dat2 * 0x100 + dat1;
で安全に元に戻せます。
(これも、0x100 が int 幅なので、 dat2 * 0x100 は int に拡張され、それに対して、int に拡張された dat1 が加算されます)
すべて符号無しなので、char -> int への拡張も問題なく行われます。
あと、かけ算や割り算は効率が悪いのではないか? という心配も無用です。
0x100 のような、(2進数で)きりの良い数のかけ算や割り算は、普通のコンパイラは、内部でシフトに置き換えますので。
皆様、ご回答どうもありがとうございます。
マイコンはルネサスのR8Cでデータフラッシュに書き込みます。
データは自分でしか使用いたしません。
皆様から教えていただいたコード等を参考にやってみます。
まずはお礼のみで失礼いたします。
No.7
- 回答日時:
>マイコンのフラッシュ領域にint型のデータ(2バイト)を1バイトづつ書き込む
8bitのIOポートからFIFOバッファを利用して読み書きするタイプなのかな?
IOのアドレスをFportとすると
unsigned int data;
char *c;
c = (char *)&data;
Fport = c[0];
Fport = c[1];
という方法で書き込めます。書いた通りの順番に読み出せば復元できますから、バイト・オーダーとかは気にする必要はありません。
皆様、ご回答どうもありがとうございます。
マイコンはルネサスのR8Cでデータフラッシュに書き込みます。
データは自分でしか使用いたしません。
皆様から教えていただいたコード等を参考にやってみます。
まずはお礼のみで失礼いたします。
No.5
- 回答日時:
処理系依存の問題ですね。
エンディアンも含めた対応をここで回答してみます。
マイコンが何かはわかりませんが、ルネサスの純正コンパイラ(H8でもVer6以降)
であれば、#pragma bit_order でビットの並びが右並びか左並びを指定できます。
仕様として、質問者の例として
555 == 0x22B
dat1に2B
dat2に02
を書くことを目的とすることを考えてみます。
意図した質問かどうかにもよりますが、質問者の例(dat2 = (char)(data >> 8);に訂正済み)では
bigエンディアンの場合にdat2がdat1と連続したアドレスで、dat1のアドレスからintで見たとき
に22Bにならず2B02の動作例になります。
逆にメモリが連続していて、intで見たとき22Bを意図するならmemcpyもありなわけです。
どちらを意図するかによっても回答が異なります。
私の場合は、上記(仕様として)に基づいて回答してみます。
#pragma bit_order right
union {
unsigned int intdat;
struct {
unsigned int chdatLow:8;
unsigned int chdatHigh:8;
} chdat;
} data;
#pragma bit_order /* 以降のビット並びはオプションに従う */
data.intdat = 555;
dat1 = data.chdat.chdatLow;
dat2 = data.chdat.chdatHigh;
説明
リトルエンディアンの場合には
0000:indat == 0x22B
0000:chdatLow == 0x2B
0001:chdatHigh == 0x02
dat1 == 0x2B
dat2 == 0x02
ビッグエンディアンの場合は
0000:indat == 0x22B
0000:chdatHigh == 0x02
0001:chdatLow == 0x2B
dat1 == 0x2B
dat2 == 0x02
皆様、ご回答どうもありがとうございます。
マイコンはルネサスのR8Cでデータフラッシュに書き込みます。
データは自分でしか使用いたしません。
皆様から教えていただいたコード等を参考にやってみます。
まずはお礼のみで失礼いたします。
No.4
- 回答日時:
処理系に依存する方法ですが、共用体が使えるなら
それを使った方がシフト演算などを使わずにスマートにできます。
下位バイトが先に来る(リトルエンディアン)の処理系ならchdat[0]とchdat[1]の順番で
上位バイトが先に来る(ビッグエンディアン)の処理系ならchdat[1]とchdat[0]の順番になります。
インテル系のCPUならリトルエンディアンですが、マイコンなら機種により違うので
確認して見て上位と下位が逆だったならchdat[0]とchdat[1]を入れ替えればいいでしょう。
質問者さんの例に合わせて書くなら、こんな感じになります。
union {
unsigned int intdat;
unsigned char chdat[2];
} data;
data.intdat = 555;
dat1 = data.chdat[0];
dat2 = data.chdat[1];
参考URL:http://ja.wikipedia.org/wiki/%E3%82%A8%E3%83%B3% …
皆様、ご回答どうもありがとうございます。
マイコンはルネサスのR8Cでデータフラッシュに書き込みます。
データは自分でしか使用いたしません。
皆様から教えていただいたコード等を参考にやってみます。
まずはお礼のみで失礼いたします。
No.3
- 回答日時:
> dat2 = (char)data >> 8;
ここが間違っていることは明らかですが、それ以外は処理系不明なので何ともいえません。
(int型が2バイトであること以外)処理系に依存しないようにするのであれば、
unsigned int data;
unsigned char dat1,dat2;
data = 555;
dat1 = (unsigned char)data;
dat2 = (unsigned char)(data >> CHAR_BIT);
とするのが妥当でしょうね。
皆様、ご回答どうもありがとうございます。
マイコンはルネサスのR8Cでデータフラッシュに書き込みます。
データは自分でしか使用いたしません。
皆様から教えていただいたコード等を参考にやってみます。
まずはお礼のみで失礼いたします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- MySQL MYSQL エラー 2 2022/10/18 11:37
- その他(プログラミング・Web制作) Fortranでの出力ファイル 2 2023/03/21 21:25
- その他(プログラミング・Web制作) pandasでまとめてインデックスを削除するにはどうすればいいですか? たとえば、以下のプログラムで 1 2022/07/31 23:09
- その他(プログラミング・Web制作) google formsを使ったタスク依頼フォーム作成におけるご相談 1 2023/06/22 15:55
- UNIX・Linux Linuxについて質問です。 以下のような設定をしたMakefileを作成するにはどう記述すればよい 1 2023/02/03 20:10
- C言語・C++・C# C言語 共用体について コマンドライン引数で値を2つ入力したときに、argv[2]の値をUNI u1 4 2022/04/25 20:34
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- C言語・C++・C# pythonのファイルの並びでの読み込みとリストについて 4 2022/04/13 03:52
このQ&Aを見た人はこんなQ&Aも見ています
-
【お題】NEW演歌
【大喜利】 若い人に向けたことは分かるけど、それはちょっと寄せ過ぎて変になってないか?と思った演歌の歌詞
-
大人になっても苦手な食べ物、ありますか?
大人になっても、我慢してもどうしても食べれないほど苦手なものってありますよね。 あなたにとっての今でもどうしても苦手なものはなんですか?
-
とっておきの手土産を教えて
お呼ばれの時や、ちょっとした頂き物のお礼にと何かと必要なのに 自分のセレクトだとついマンネリ化してしまう手土産。 ¥5,000以内で手土産を用意するとしたらあなたは何を用意しますか??
-
おすすめのモーニング・朝食メニューを教えて!
コメダ珈琲店のモーニング ロイヤルホストのモーニング 牛丼チェーン店の朝食などなど、おいしいモーニング・朝食メニューがたくさんありますよね。
-
お風呂の温度、何℃にしてますか?
みなさん、家のお風呂って何℃で入ってますか? ぬるめのお湯にゆったり…という方もいれば、熱いのが好き!という方もいるかと思います。 我が家は平均的(?)な42℃設定なのですが、みなさんのご家庭では何℃に設定していますか?
-
16進数を2文字ずつ配列に格納したい
C言語・C++・C#
-
BOOL値を逆にしたい
C言語・C++・C#
-
char型2つを結合し、short型に格納したい
C言語・C++・C#
-
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/22】このサンタクロースは偽物だと気付いた理由とは?
- ・お風呂の温度、何℃にしてますか?
- ・とっておきの「まかない飯」を教えて下さい!
- ・2024年のうちにやっておきたいこと、ここで宣言しませんか?
- ・いけず言葉しりとり
- ・土曜の昼、学校帰りの昼メシの思い出
- ・忘れられない激○○料理
- ・あなたにとってのゴールデンタイムはいつですか?
- ・とっておきの「夜食」教えて下さい
- ・これまでで一番「情けなかったとき」はいつですか?
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
printfの%eで指数部分の桁数を...
-
stable diffusionのエラー
-
c言語での wavファイルの編集(...
-
C言語 ファイル内のデータと入...
-
System.Collections.ArrayList ...
-
エクセルVBA:日付データの変換...
-
ポインター引数の関数でコンパ...
-
VBA構文で分の表示を 00分と表...
-
パイプを用いたプロセス間通信...
-
エクセルシート名の制限を変更...
-
UTF-8で5~6バイトになる文字コ...
-
10Mバイトて文字数に すると何...
-
DataGridViewの特定列に入力さ...
-
バイト列とバイナリ列の違いが...
-
UCS-2の一覧表が欲しい
-
COBOLのCOMP形式について
-
Excel VBA メール作成について ...
-
Excel 1セル当りの文字数が2...
-
VBAでShift-JISのURLエンコード
-
VB.NET LeftBの代用
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
printfの%eで指数部分の桁数を...
-
stable diffusionのエラー
-
ポインター引数の関数でコンパ...
-
エクセルVBA:日付データの変換...
-
C#でのswitch文
-
CreateProcessでの環境変数の設...
-
RegQueryValueExでの2バイト文字
-
'dataType' 引数を Null にする...
-
【Excel VBA】10進数を2進数に...
-
C++ multipart/form-data f
-
matlabのソースコードをpython...
-
Cのプログラムがどうしても動き...
-
テキストファイルの結合について
-
int型(2バイト)データの分割
-
Excel VBA グラフ作成のとき...
-
C言語 構造体の名前欄?を小文...
-
CSVファイルの行と列のセルって...
-
C++/CLIのオブジェクト型配列
-
C言語 ファイル内のデータと入...
-
C言語についてです! 同じ年の...
おすすめ情報