お願いします。現在、C言語を勉強しているのですが、
long lret = 15000;
unsigned char b[sizeof(long)];
memcpy( b, &lret, sizeof(long) );
printf("%lu\n", (long*)(b)); ★
★マークのところで15000と表示させたいのですが、うまくいきません。
どうしたらprintfで表示できるのでしょうか。
よろしくお願いします。
キャストした値のprintf表示
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: キャストした値のprintf表示
ただ表示したいだけならキャストもmempyも必要ありませんよ。
現状のコードは型を全く無視して処理しているのでうまくは動きません。
それと、(long*)(b)だとポインタのキャストなのでbのポインタ値を表示することになります。
longに関しては環境依存なので環境(コンパイラとOS)とC言語の規格の種類を書いてもらわないと答えようが無いです。
intとlongが同じ範囲の値を示す環境も多々あります。
それと元がただのlongなのになぜ%luで表示しようとしているんでしょうか?
現状のコードは型を全く無視して処理しているのでうまくは動きません。
それと、(long*)(b)だとポインタのキャストなのでbのポインタ値を表示することになります。
longに関しては環境依存なので環境(コンパイラとOS)とC言語の規格の種類を書いてもらわないと答えようが無いです。
intとlongが同じ範囲の値を示す環境も多々あります。
それと元がただのlongなのになぜ%luで表示しようとしているんでしょうか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: キャストした値のprintf表示
Windowsでcygwinのgccでコンパイルしたソースコード。
実行結果。
#include <stdio.h>
int main(void)
{
long lret = 15000;
int iret = 15000; //boxさん指摘の書き間違いを修正。
printf( "lret(%ubyte)=%d\n",sizeof(lret), lret );
printf( "iret(%ubyte)=%d\n",sizeof(iret), iret );
return 0;
}
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: キャストした値のprintf表示
5行目と7行目のペア、あるいは
6行目と8行目のペア
が、どちらか片方だけあればよいのでは?
というのは、当方の見間違いでしょうか。
ペアが2組なければならない理由が、よくわかりません。
6行目と8行目のペア
が、どちらか片方だけあればよいのでは?
というのは、当方の見間違いでしょうか。
ペアが2組なければならない理由が、よくわかりません。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。
プログラムは思ったとおりには動かない。書いたとおりに動く。
Re: キャストした値のprintf表示
内部表現(いわゆるバイト列)からlongを復元したいということですね。
printf("%lu\n", *(long*)b);
printf("%lu\n", *(long*)b);