キャストした値のprintf表示

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
勉強中太郎

キャストした値のprintf表示

#1

投稿記事 by 勉強中太郎 » 13年前

お願いします。現在、C言語を勉強しているのですが、

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

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

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

よろしくお願いします。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

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

#2

投稿記事 by softya(ソフト屋) » 13年前

ただ表示したいだけならキャストもmempyも必要ありませんよ。
現状のコードは型を全く無視して処理しているのでうまくは動きません。
それと、(long*)(b)だとポインタのキャストなのでbのポインタ値を表示することになります。

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

それと元がただのlongなのになぜ%luで表示しようとしているんでしょうか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

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

#3

投稿記事 by softya(ソフト屋) » 13年前

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
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

box
記事: 2002
登録日時: 14年前

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

#4

投稿記事 by box » 13年前

5行目と7行目のペア、あるいは
6行目と8行目のペア
が、どちらか片方だけあればよいのでは?
というのは、当方の見間違いでしょうか。
ペアが2組なければならない理由が、よくわかりません。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

ISLe
記事: 2650
登録日時: 14年前
連絡を取る:

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

#5

投稿記事 by ISLe » 13年前

内部表現(いわゆるバイト列)からlongを復元したいということですね。

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

たかぎ
記事: 328
登録日時: 14年前
住所: 大阪
連絡を取る:

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

#6

投稿記事 by たかぎ » 13年前

処理系不明ですが...

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

コード:

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

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

閉鎖

“C言語何でも質問掲示板” へ戻る