web-dev-qa-db-ja.com

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

私は以下のプログラムを持っています

#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]

shortデータ型にlongを使用して長さ修飾子(unsignedintなど)を使用する場合、C99 specification - 7.19.6 Formatted input/output functionsを参照したところ、正しいフォーマット指定子を理解できませんでした。

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

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

111

"%h"修飾子を使ってみてください。

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

ISO/IEC 9899:201x - 7.21.6.1-7

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

141
cnicutar

scanfには%huへのポインタを渡しているのでunsigned shortを使う必要があります。 printfについては、デフォルトの昇格のためunsigned shortを渡すことは不可能です(intが少なくともunsigned intと同数の値ビットを持つかどうかに応じてintまたはunsigned shortに昇格されます)ので、%dまたは%uは問題ありません。あなたが望むなら、あなたは%huを自由に使用できます。

44
R..

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

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

そのため、符号なし短整数を出力するには、フォーマット文字列を"%hu"にする必要があります。

これがprintf指定子の 良い表 です。それで、それは%huのためのunsigned short intであるべきです。

そして ウィキペディアの "C data types"へのリンク も同様です。

2
foo bar