ページ 1 / 1
キャストした値の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));