unsigned short intのフォーマット指定子は何ですか?


124

次のプログラムがあります

#include <stdio.h>

int main(void)
{
    unsigned short int length = 10; 

    printf("Enter length : ");
    scanf("%u", &length);

    printf("value is %u \n", length);

    return 0;
}

これを使用してコンパイルするとgcc filename.c、次の警告が発行されます(scanf()行内)。

warning: format ‘%u’ expects argument of type ‘unsigned int *’, but argument 2 has type ‘short unsigned int *’ [-Wformat]

それから呼ばC99 specification - 7.19.6 Formatted input/output functions及び長さ修飾子を使用するときに正しい形式指定子を理解できなかった(のようなshortlongで、など)unsignedのためのintデータ型。

%u正しい指定子はありますunsigned short intか?もしそうなら、なぜ私は上記の警告を受けますか?!

編集:ほとんどの場合、私は試みました%uh、そしてそれはまだ警告を出していました。


2
printf("%u\n", (unsigned int)length); //あなたが読んだC99仕様が保証するので、常に機能しますsizeof(short) <= sizeof(int)(ただし、以下のこの質問への実際の回答はもちろんはるかに優れています)
Philip

1
キャストの必要はありません。デフォルトのプロモーションがそれを処理します。
R .. GitHub ICE HELPING ICEの停止2012年

回答:


155

"%h"修飾子を使用してみてください:

scanf("%hu", &length);
        ^

ISO / IEC 9899:201x-7.21.6.1-7

次のd、i、o、u、x、X、またはn変換指定子が、shortまたはunsigned shortへのポインターを持つ引数に適用されることを指定します。


47

の場合scanf%huポインタをに渡すので、を使用する必要がありますunsigned short。以下のためにprintf、それが合格することは不可能だunsigned shortプロモーションをデフォルトに起因すると(それが促進されるintunsigned intかどうかに応じてint、少なくとも多くの値ビットなどとして持っているunsigned shortかどうか)そう%dか、%u大丈夫です。%huただし、必要に応じて自由に使用できます。


7

Linuxのマニュアルページから:

h次の整数変換は、short intまたはunsigned short int引数、または
       n変換の低下は、short int引数へのポインターに対応します。

したがって、符号なし短整数を出力するには、フォーマット文字列はでなければなりません"%hu"


(charのように)自動的にintに昇格されるため、short intを「printf」する方法ではないと思います。
Alexey Frunze 2012年

2
printfの@Alex%hu /%hdは機能します。C99以降でのみ利用できるのは%hhu /%hhdでした。%hと%hhは&0xFFFF応答を意味します。渡された整数の&0xFF。
ヨルゲンセン

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.