質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

5回答

1894閲覧

C言語 memcpy 教えてください

marymills

総合スコア18

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2018/12/27 02:40

前提・実現したいこと

C言語初心者です
C言語をpythonに書き換えております。

memcpy を調べると
&i の先頭から4文字分を、&Rへコピーする。
&iと&Rの先頭から4文字分とはどこまでなのでしょうか?
memcpyの前と後で変わってないのでよくわかりませんでした。
Rが943.623になるのかも全く理解できませんでした。
詳しく教えていただきたいです

また memcpy(&R, &i, 4);の一行をpythonでどのように書けば同じことを実現できますか?

memcpy前 i 1147922398 R 0 &i 0x7ffee79f8e84 &R 0x7ffee79f8e80 memcpy後 i 1147922398 Rは 943.623 &i 0x7ffee79f8e84 &R 0x7ffee79f8e80

該当のソースコード

int i; i = 1147922398; float R = 0; printf("memcpy前\n"); printf("i %d\n",i); printf("R %g\n",R); printf("&i %p\n",&i); printf("&R %p\n",&R); memcpy(&R, &i, 4); printf("memcpy後\n"); printf("i %d\n",i); printf("R %g\n",R); printf("&i %p\n",&i); printf("&R %p\n",&R);

試したこと

補足情報(FW/ツールのバージョンなど)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答5

0

4文字

文字っていうか、バイト数

|アドレス|memcpy前の値|memcpy後の値|
|:--|:--:|
|0x7ffee79f8e80(=&R)|0x00|0xDE|
|0x7ffee79f8e81|0x00|0xE7|
|0x7ffee79f8e82|0x00|0x6B|
|0x7ffee79f8e83|0x00|0x44|
|0x7ffee79f8e84(=&i)|0xDE|0xDE|
|0x7ffee79f8e85|0xE7|0xE7|
|0x7ffee79f8e86|0x6B|0x6B|
|0x7ffee79f8e87|0x44|0x44|

バイト列{0xDE,0xE7,0x6B,0x44}を
int(32bit符号付き整数)として解釈すると1147922398
float(32bit浮動小数点数)として解釈すると943.623

投稿2018/12/27 03:01

編集2018/12/27 03:05
ozwk

総合スコア13521

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

marymills

2018/12/27 04:11

943.623という全く意味不明の数字だったのでこのように回答いただけると先に進めます
guest

0

&i の先頭から4文字分を、&Rへコピーする。

&iと&Rの先頭から4文字分とはどこまでなのでしょうか?

誤解されているようです。
以下のコードは変数Rのブロックポインターに対して、変数iのブロックポインターより4バイト分のデータをコピーするという事です。
memcpy(&R, &i, 4);

メモリ上、int型変数は2バイト又は4バイト(x86かx64のビルド環境に依存)、float型変数は4バイトで管理されます。
実行環境が不明ですが、x86環境では上記のコードは以下の危険性をはらんでいると思われます。
x86環境ではintは2バイト管理なので3バイト目以降のメモリにはどんな値が割り当てるられているかが不明なのでメモリを破壊する可能性があります。

float型変数にint型変数の値を代入したいようですが、memcpyで行っているのでバグコード?なので、仕様上であるべき姿が何なのかを検討した上でpythonに移植する方が良いと思います。

投稿2018/12/27 03:18

kinkin334

総合スコア62

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pepperleaf

2018/12/27 11:37

余談ですが、、、 > memcpyで行っているのでバグコード? 世の中には、そんなコードで動いているものもあります。 そのしばらく先で、int → float にコピーして使ってた、なんてのもあって、、、。でもうっかり触ると評価が必要&作り壊しのリスクで放置、という現実です。 参考までに。
guest

0

ベストアンサー

&i の先頭から4文字分を、&Rへコピーする。

「4バイト分」です。
int型変数と、float型変数がどちらも4バイトという前提のプログラムです。

intの中味を、データそのままfloat型変数にコピーしています。
10進数の1147922398は、2進数で書くと、1000100011010111110011111011110で、これを浮動小数点データと見なすと、943.623に相当すると言う事です。

Pythonに書き換えるということだと、整数4バイトとしてpackして、浮動小数点4バイトとしてunpackします。
参考: https://docs.python.jp/3/library/struct.html

投稿2018/12/27 03:03

編集2018/12/27 03:22
otn

総合スコア84538

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

marymills

2018/12/27 04:04

早々の回答ありがとうございます。 全く挙動がわからなかったので、的確な回答参考になります。
guest

0

Pythonはわからないので他の方に任せてC言語のところだけ。

4文字分を

実際には4byte分と解釈してもらってよいです。

int型もfloat型も4byte長(=32bit長)なので、
memcpy(&R, &i, 4);とすることで、
数値としてではなく、メモリ内の32bitのバイナリ値をそのままコピーしているだけです。
(※なおintは厳密には4byte長と決まっているわけではないです)

Rが943.623になるのかも全く理解できませんでした。

‭変数iの32bitのメモリ状態をfloat型として解釈したときに、そのような数値になるのだと思います。

投稿2018/12/27 02:50

takabosoft

総合スコア8356

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

int の変数とfloatの変数は構造が全く違うので単純にコピーでは数値は反映されません
#デタラメの値になる

おなじ型の変数間でコピーしましょう

投稿2018/12/27 02:45

y_waiwai

総合スコア87774

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問