私がCでint16_t
またはint32_t
を理解する方法は、それらがコンピューター上でそれぞれ16ビットおよび32ビットの数値であるとtypedefされていることです。異なるシステムが常にint
を32ビットまたはshort
を16ビットとして表すとは限らないため、これらが16または32ビットであることを保証する必要がある場合にこれらを使用すると思います正しいですか?オンラインで見ると、複雑な答えが見つかります。
私の質問は、実際にscanf
のような関数を使用して、int16_t
またはint32_t
またはその他のtypedefされた数値型のユーザーから入力を取得する方法を教えてください。 16ビットか32ビットか何か特別な文字列修飾子はありますか?通常、ユーザーからint
を取得したい場合は、次のように書いて、実際にどれほど大きいかを気にしないでください。
scanf("%d", &int);
これは、int32_t
を渡した場合に機能しますが、これは、システムのint
が32ビットであり、32ビットの数値を具体的に提供しないため、int
。 32ビットであることが保証されている数値を取得するにはどうすればよいですか?私は この文字列修飾子のページ と他のいくつかの場所を調べましたが、これらのtypedefされた数値型についての言及は見つかりませんでした。
編集:私の質問への回答を受け取って以来、私はいくつかのグーグル検索を行い、 this を見つけました。参考までに以下に含めました。
uppercase hexadecimal printf format for uintptr_t
#define SCNd16 "d"
decimal scanf format for int16_t
#define SCNd32 "ld"
decimal scanf format for int32_t
#define SCNd8 "hhd"
decimal scanf format for int8_t
#define SCNdFAST16 "d"
decimal scanf format for int_fast16_t
#define SCNdFAST32 "ld"
decimal scanf format for int_fast32_t
#define SCNdFAST8 "hhd"
decimal scanf format for int_fast8_t
#define SCNdLEAST16 "d"
decimal scanf format for int_least16_t
#define SCNdLEAST32 "ld"
decimal scanf format for int_least32_t
#define SCNdLEAST8 "hhd"
decimal scanf format for int_least8_t
#define SCNdPTR SCNd16
decimal scanf format for intptr_t
#define SCNi16 "i"
generic-integer scanf format for int16_t
#define SCNi32 "li"
generic-integer scanf format for int32_t
#define SCNi8 "hhi"
generic-integer scanf format for int8_t
#define SCNiFAST16 "i"
generic-integer scanf format for int_fast16_t
#define SCNiFAST32 "li"
generic-integer scanf format for int_fast32_t
#define SCNiFAST8 "hhi"
generic-integer scanf format for int_fast8_t
#define SCNiLEAST16 "i"
generic-integer scanf format for int_least16_t
#define SCNiLEAST32 "li"
generic-integer scanf format for int_least32_t
#define SCNiLEAST8 "hhi"
generic-integer scanf format for int_least8_t
#define SCNiPTR SCNi16
generic-integer scanf format for intptr_t
#define SCNo16 "o"
octal scanf format for uint16_t
#define SCNo32 "lo"
octal scanf format for uint32_t
#define SCNo8 "hho"
octal scanf format for uint8_t
#define SCNoFAST16 "o"
octal scanf format for uint_fast16_t
#define SCNoFAST32 "lo"
octal scanf format for uint_fast32_t
#define SCNoFAST8 "hho"
octal scanf format for uint_fast8_t
#define SCNoLEAST16 "o"
octal scanf format for uint_least16_t
#define SCNoLEAST32 "lo"
octal scanf format for uint_least32_t
#define SCNoLEAST8 "hho"
octal scanf format for uint_least8_t
#define SCNoPTR SCNo16
octal scanf format for uintptr_t
#define SCNu16 "u"
decimal scanf format for uint16_t
#define SCNu32 "lu"
decimal scanf format for uint32_t
#define SCNu8 "hhu"
decimal scanf format for uint8_t
#define SCNuFAST16 "u"
decimal scanf format for uint_fast16_t
#define SCNuFAST32 "lu"
decimal scanf format for uint_fast32_t
#define SCNuFAST8 "hhu"
decimal scanf format for uint_fast8_t
#define SCNuLEAST16 "u"
decimal scanf format for uint_least16_t
#define SCNuLEAST32 "lu"
decimal scanf format for uint_least32_t
#define SCNuLEAST8 "hhu"
decimal scanf format for uint_least8_t
#define SCNuPTR SCNu16
decimal scanf format for uintptr_t
#define SCNx16 "x"
hexadecimal scanf format for uint16_t
#define SCNx32 "lx"
hexadecimal scanf format for uint32_t
#define SCNx8 "hhx"
hexadecimal scanf format for uint8_t
#define SCNxFAST16 "x"
hexadecimal scanf format for uint_fast16_t
#define SCNxFAST32 "lx"
hexadecimal scanf format for uint_fast32_t
#define SCNxFAST8 "hhx"
hexadecimal scanf format for uint_fast8_t
#define SCNxLEAST16 "x"
hexadecimal scanf format for uint_least16_t
#define SCNxLEAST32 "lx"
hexadecimal scanf format for uint_least32_t
#define SCNxLEAST8 "hhx"
hexadecimal scanf format for uint_least8_t
#define SCNxPTR SCNx16
hexadecimal scanf format for uintptr_t
それらの場合、inttypes.h
やSCNd64
などのSCNu32
のマクロを使用する必要があります。
scanf("%" SCNd32, &x);