type変換指定子に関する文書
★Visual Studio 2019のtype変換指定子(ページ中段)
https://docs.microsoft.com/ja-jp/cpp/c-runtime-library/format-specification-syntax-printf-and-wprintf-functions?view=vs-2019
日本語の説明文がぎこちない時は「英語で読む」をONにした方がいいです^^;。
各データ型が取る範囲に関する文書
整数値
https://docs.microsoft.com/ja-jp/cpp/c-language/cpp-integer-limits?view=vs-2019
https://docs.microsoft.com/ja-jp/cpp/c-language/limits-on-floating-point-constants?view=vs-2019
型に応じたtype変換指定子と実験結果
実験結果を書く前に・・・、unsigned int と unsigned long int について
unsigned int %u unsigned long int %lu
と某書籍に書かれていたのですが・・・、Visual Studio 2019では unsigned int と unsigned long intの最大値が同じなので、%u と %lu は実質的に同じです。
<結果1> short int として受け取る %hd
32767 を %hd で受けると: 32767 short intは 2 バイト(-32768 ~ 32767)
<結果2> %hd(short int)の範囲をオーバーした場合
32770 を %hd で受けると: -32766 short intは 2 バイト(-32768 ~ 32767)
<結果3> long int として受け取る %ld
2147483647 を %ld で受けると: 2147483647 long intは 4 バイト(-2147483648 ~ 2147483647)
<結果4> %ld(long int)の範囲をオーバーした場合
2147483650 を %ld で受けると: -2147483646 long intは 4 バイト(-2147483648 ~ 2147483647)
<結果5> unsigned int として受け取る %u
4294967295 を %u で受けると: 4294967295 unsigned intは 4 バイト(最大値 4294967295)
<結果6> %u(unsigned int)の範囲をオーバーした場合
4294967296 を %u で受けると: 0 unsigned intは 4 バイト(最大値 4294967295) [備考] %uではなく%llu(または %I64u)を使いなさいとメッセージが出た。
<結果7> long long int として受け取る %lld
4294967296 を %lld で受けると: 4294967296 long long intは 8 バイト(-9223372036854775808 ~ 9223372036854775807)
<結果8> %lld(long long int)の範囲をオーバーした場合
9223372036854775810 を %lld で受けると: -9223372036854775806 long long intは 8 バイト(-9223372036854775808 ~ 9223372036854775807)
<結果9> unsigned long long int として受け取る %llu
18446744073709551615 を %llu で受けると: 18446744073709551615 unsigned long long intは 8 バイト(最大値 18446744073709551615) [備考] 最大値は1844京以上。
<結果10> %llu(unsigned long long int)の範囲をオーバーした場合
unsigned long long intの最大値よりも大きい値を指定してビルド しようとしたらビルドできず・・・。
上記結果の元となったコード
<コード1>
#include <stdio.h> #include <limits.h> int main(void) { printf("32767 を %%hd で受けると: %hd\n", 32767); printf("short intは %d バイト(%d ~ %d)\n", sizeof(short int), SHRT_MIN, SHRT_MAX); return 0; }
<コード2>
#include <stdio.h>
#include <limits.h>
int main(void) { printf("32770 を %%hd で受けると: %hd\n", 32770); printf("short intは %d バイト(%d ~ %d)\n", sizeof(short int), SHRT_MIN, SHRT_MAX); return 0; }
<コード3>
#include <stdio.h>
#include <limits.h>
int main(void) { printf("2147483647 を %%ld で受けると: %ld\n", 2147483647); printf("long intは %d バイト(%d ~ %d)\n", sizeof(long int), LONG_MIN, LONG_MAX); return 0; }
<コード4>
#include <stdio.h>
#include <limits.h>
int main(void) { printf("2147483650 を %%ld で受けると: %ld\n", 2147483650); printf("long intは %d バイト(%d ~ %d)\n", sizeof(long int), LONG_MIN, LONG_MAX); return 0; }
<コード5>
#include <stdio.h>
#include <limits.h>
int main(void) { printf("4294967295 を %%u で受けると: %u\n", 4294967295); printf("unsigned intは %d バイト(最大値 %u)\n", sizeof(unsigned int), UINT_MAX); return 0; }
<コード6>
#include <stdio.h>
#include <limits.h>
int main(void) { printf("4294967296 を %%u で受けると: %u\n", 4294967296); printf("unsigned intは %d バイト(最大値 %u)", sizeof(unsigned int), UINT_MAX); return 0; }
<コード7>
#include <stdio.h>
#include <limits.h>
int main(void) { printf("4294967296 を %%lld で受けると: %lld\n", 4294967296); printf("long long intは %d バイト(%lld ~ %lld)", sizeof(long long int), LLONG_MIN, LLONG_MAX); return 0; }
<コード8>
#include <stdio.h>
#include <limits.h>
int main(void) { printf("9223372036854775810 を %%lld で受けると: %lld\n", 9223372036854775810); printf("long long intは %d バイト(%lld ~ %lld)", sizeof(long long int), LLONG_MIN, LLONG_MAX); return 0; }
<コード9>
#include <stdio.h>
#include <limits.h>
int main(void) { printf("18446744073709551615 を %%llu で受けると: %llu\n", 18446744073709551615); printf("unsigned long long intは %d バイト(最大値 %llu)", sizeof(unsigned long long int), ULLONG_MAX); return 0; }
<コード10>
/* このコードはビルドできなかった */
#include <stdio.h>
#include <limits.h>
int main(void) { printf("18446744073709551620 を %%llu で受けると: %llu\n", 18446744073709551620); printf("unsigned long long intは %d バイト(最大値 %llu)", sizeof(unsigned long long int), ULLONG_MAX); return 0; }