恥は/dev/nullへ by 初心者

プログラミング素人がのろのろと学んだことをつづっています♪

整数を受けるtype変換指定子 on Visual Studio 2019

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; }