ページ 11

キャストした値のprintf表示

Posted: 2012年4月27日(金) 15:06
by 勉強中太郎
お願いします。現在、C言語を勉強しているのですが、

long lret = 15000;
unsigned char b[sizeof(long)];
memcpy( b, &lret, sizeof(long) );

printf("%lu\n", (long*)(b));   ★

★マークのところで15000と表示させたいのですが、うまくいきません。
どうしたらprintfで表示できるのでしょうか。

よろしくお願いします。

Re: キャストした値のprintf表示

Posted: 2012年4月27日(金) 16:02
by softya(ソフト屋)
ただ表示したいだけならキャストもmempyも必要ありませんよ。
現状のコードは型を全く無視して処理しているのでうまくは動きません。
それと、(long*)(b)だとポインタのキャストなのでbのポインタ値を表示することになります。

longに関しては環境依存なので環境(コンパイラとOS)とC言語の規格の種類を書いてもらわないと答えようが無いです。
intとlongが同じ範囲の値を示す環境も多々あります。

それと元がただのlongなのになぜ%luで表示しようとしているんでしょうか?

Re: キャストした値のprintf表示

Posted: 2012年4月27日(金) 16:10
by softya(ソフト屋)
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;
}
実行結果。

コード:

lret(4byte)=15000
iret(4byte)=15000

Re: キャストした値のprintf表示

Posted: 2012年4月27日(金) 16:19
by box
5行目と7行目のペア、あるいは
6行目と8行目のペア
が、どちらか片方だけあればよいのでは?
というのは、当方の見間違いでしょうか。
ペアが2組なければならない理由が、よくわかりません。

Re: キャストした値のprintf表示

Posted: 2012年4月27日(金) 17:33
by ISLe
内部表現(いわゆるバイト列)からlongを復元したいということですね。

printf("%lu\n", *(long*)b);

Re: キャストした値のprintf表示

Posted: 2012年4月28日(土) 00:24
by たかぎ
処理系不明ですが...

どういう回答を期待しているのか分かりませんが、こういうことでしょうか?

コード:

long lret = 15000;
_Alignas(long) unsigned char b[sizeof(long)];
memcpy( b, &lret, sizeof(long) );

printf("%lu\n", *(long*)(b));