Top Page [◀◀]  2   3   4   5   6   7   8   9   ... [▶▶Last Page

printfの表示はこれで正常なのでしょうか?

お世話になります
CS+のRX63Tで開発しています
以下のようなソースですが
int a;
long b;
a=-5;
b=(long)a;
printf("a=%d(%04X) b=%ld(%08lX) \r",(int)a,(int)a,b,b);
printf("%d \r",(int)sizeof(a));
これを実行すると
a=-5(FFFFFFFB) b=-5(FFFFFFFB)
2
が表示されます
intのサイズが2Byteであるにもかかわらず
printfで指定した%04Xが無視されて4Byte分のFFFFFFFBが
表示されております、これはC言語の仕様なのでしょうか?

  • 菅原です。今年もよろしくお願いします。
    ルネサスのコンパイラですよね。とくに設定しない限り、RXの int は32bitですよ。
  • IKUZOさん
    自分も誤解していたけど、出力幅には最小値を与える事になっているらしいです。
    出力幅より長くなれば勝手にチョン切らないでそのまま出す事になります。
    他も同じみたいです。(”ANSI printf width”なんかでググると解ります)

  • In reply to ビーコン菅原:

    ビーコン菅原さん
    それは「とくに設定」しております、printf("%d \r",(int)sizeof(a)); 2Byteを出力しております。
  • In reply to ほや:

    ほやさん、
    やっぱりそうでしたか、なんかわかりにくいので、初心者はこんなところでもつまずきますよね、
    つまり、「これで正常」「C言語の仕様」で納得です、
    つまり上記のような場合には
    printf("a=%d(%04X) b=%ld(%08lX) \r",(int)a,(int)a,b,b);
    ではなく
    printf("a=%d(%04X) b=%ld(%08lX) \r",(int)a&0xFFFF,(int)a&0xFFFF,b,b);
    とすべきなんでしょうね。
  • わわいです
    もともとのint幅4byteをオプションで2byteにしたと言っても、たんにコード上のint をshort相当にするだけ、なんで、呼び出し規約やらなんやらまで変えるわけでないので、関数の引数などは本来のint幅にキャストされるということなんでしょう。
    まあ、C言語の仕様というより、コンパイラの都合というかんじもします
  • In reply to わわい:

    話が逸れますが、標準ライブラリはキャストやint_to_shortの指定でアクセス幅が変更されている事までは知らないので、%dや%xの相手は普通のintだと期待してreadしてしまうから要注意です。マニュアルに書いてあった…ような気がする。
  • In reply to ほや:

    わわいさんほやさん
    なるほど、printfの%dは32ビット幅と覚えておくと良いということですかね。
  • In reply to IKUZO:

    わわいです
    というより、
    C言語では、関数の引数ではcharだろうとshortだろうとintに自動的にキャストされます
    同様に、floatはdoubleにキャストされます
    これが、コンパイラオプションでint をshortに読み替える、としたところで、ここでキャストされるのは本来のint幅、ということなんでしょう
  • > printf("a=%d(%04X) b=%ld(%08lX) \r",(int)a,(int)a,b,b);

    printf("a=%hd(%04hX) b=%ld(%08lX) \r",a,a,b,b); で期待された結果にならないですか?

    https://wandbox.org/permlink/ZfcYrzwwLc6cz4WW

  • In reply to わわい:

    わわいさん
    キャストに頼りすぎてはいけないということで、よくわかりました。
  • In reply to fujita nozomu:

    fujita nozomuさん
    ソース
    int a;
    long b;
    a=-5;
    b=(long)a;
    printf("a=%d(%04X) b=%ld(%08lX) \r",(int)a,(int)a,b,b);
    printf("%d \r",(int)sizeof(a));
    printf("a=%hd(%04hX) b=%ld(%08lX) \r",a,a,b,b);
    実行結果
    a=-5(FFFFFFFB) b=-5(FFFFFFFB)
    2
    a=-5(FFFB) b=-5(FFFFFFFB)
    期待した結果になりました
    Wandboxのリンクの方はちょっと時間がかかりそうだったです、
    なるほど%04Xを%04hXにすれば良かったんですね、
    printfの仕様というのが奥が深いですね、
    いいこと教えていただけました、
    fujita nozomuさんありがとうございます。
  • In reply to IKUZO:

    fujitaさんが別のスレッドで「知識は大したことありませんが不明点は確認するよう心がけています。」と書き込まれてます。私には耳の痛い話です。ついつい面倒になって未確認で済ませてしまいます。
    少し読みづらい構成ですがCC_RXのprintfはCC-RXコンパイラユーザーズマニュアルに書かれていることがすべてだと思います。逆に抜け漏れがあるとか具体的なわかりづらい点があるならかふぇルネに書き込むのは有効だと思います。私はそれぞれのコンパイラーのマニュアルと詳説C言語とプログラム言語CのみでANSI規格を読んだことがありませんが、一般論のprintfならANSI規格で確認するのがベストに思えます。

  • In reply to kijo:

    kijoさん
    もうそろそろ、kijoさんの書き込みがあるんじゃないかと思っていました
    「耳の痛い話」もなにも、それを考えてたら、質問等できません
    気楽にいったらいいんじゃないでしょうか。
  • In reply to IKUZO:

    IKUZOさん
    確認方法の違いだけで、誰かに聞くか、書類を見るか。かな。
    そもそも何が分からないか、が分からないと何もできませんし^^;
    気楽で良いと思いますよ。

    面白そうなスレッドなら反応するけど、興味がなかったら反応しませんし、フォーラムなんてそんなもんでしょう:-P

  • In reply to Kirin:

    Kirinさん
    検索したら
    That was kind of funny. :-p
    それは少し面白かったね。
    でした、
    「誰かに聞くか」ということで私の場合は「かふぇルネ」ですね、
    RXだとか社内にやっている人いませんし、
    ありがたく思っています、
    特に昔から書き込みされる面々で、毎日見てる中で
    最近あの人どうしているんだろと思ったり、
    適当な投稿でもいいから、元気だよとか。

Top Page [◀◀]  2   3   4   5   6   7   8   9   ... [▶▶Last Page