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にした方がいいです^^;。
★%dと%iの違いに関する情報
https://www.it-swarm.dev/ja/c++/%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%83%E3%83%88%E3%81%95%E3%82%8C%E3%81%9Fio%E9%96%A2%E6%95%B0%E3%81%AE%E5%A4%89%E6%8F%9B%E6%8C%87%E5%AE%9A%E5%AD%90%EF%BC%85i%E3%81%A8%EF%BC%85d%E3%81%AE%E9%81%95%E3%81%84%E3%81%AF%E4%BD%95%E3%81%A7%E3%81%99%E3%81%8B%EF%BC%88-printf-scanf%EF%BC%89/968640762/
各データ型が取る範囲に関する文書
整数値
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;
}