符号無し整数型の最大値を得る | Programming Place Plus C言語編 逆引き

トップページC言語編逆引き

このページの概要 🔗

以下は目次です。

目的 🔗

ある符号無し整数型で表現できる最大値を使いたいとします。

たとえば、unsigned int型の変数を定義するとき、表現できる最大値で初期化したい場合、どのように書けるでしょうか。

unsigned int a = ???;

方法①(-1 を使う) 🔗

-1 を与えるのが簡単です。

#include <stdio.h>

int main(void)
{
    unsigned int a = -1;
    unsigned char b = -1;
    unsigned long long c = -1;

    printf("%u\n", a);
    printf("%hhu\n", b);
    printf("%llu\n", c);
}

実行結果:

4294967295
255
18446744073709551615

-1 は負数ですから、符号無し整数型では表現できません。C言語の型変換のルールでは、負数を符号無し整数型に変換するときには、表現できる数になるまで、2N を加算し続けることになっています(第19章)。N は変換後の型のビット数です。

unsigned int型が 32ビットだとすると、表現できない -1 という数に、232 を加算します。この結果は、unsigned int型で表現できる最大値と一致します。

符号無し整数型の大きさが何ビットであっても、N の部分が自動的に判断されますから、つねに正しく、最大値を得られます。

方法②(標準ライブラリのマクロを使う) 🔗

符号無し整数型の最大値を定義したマクロが、標準ライブラリに用意されていますから、それを使う方法もあります。

これらのマクロは limits.h で定義されています。また、size_t型のようなほかの符号無し整数型については stdint.h で定義されています。

すべてではありませんが、代表的なものを以下に挙げます。

マクロ ヘッダ
unsigned char UCHAR_MAX limits.h
unsigned short USHRT_MAX limits.h
unsigned int UINT_MAX limits.h
unsigned long ULONG_MAX limits.h
unsigned long long ULLONG_MAX limits.h
size_t SIZE_MAX stdint.h
#include <limits.h>
#include <stdio.h>

int main(void)
{
    unsigned int a = UINT_MAX;
    unsigned char b = UCHAR_MAX;
    unsigned long long c = ULLONG_MAX;

    printf("%u\n", a);
    printf("%hhu\n", b);
    printf("%llu\n", c);
}

実行結果:

4294967295
255
18446744073709551615


参考リンク 🔗


更新履歴 🔗



逆引きのトップページへ

C言語編のトップページへ

Programming Place Plus のトップページへ



はてなブックマーク に保存 Pocket に保存 Facebook でシェア
X で ポストフォロー LINE で送る noteで書く
rss1.0 取得ボタン RSS 管理者情報 プライバシーポリシー
先頭へ戻る