Entry

プログラミングメモ - 整数型の限界値メモ

2008年09月14日

整数型のテストをする時に限界値(最大値/最小値)がなんだったかすぐ忘れちゃうので,ちょっとメモ。処理系は Cygwin gcc version 3.4.4 [Intel Pentium M] です。

char size1 byte
unsigned char255
signed char max127
signed char min-128
int size4 bytes
unsigned int4294967295
signed int max2147483647
signed int min-2147483648
short size2 bytes
unsigned short65535
signed short max32767
signed short min-32768
long size4 bytes
unsigned long4294967295
signed long max2147483647
signed long min-2147483648
long long size8 bytes
unsigned long long18446744073709551615
signed long long max9223372036854775807
signed long long min-9223372036854775808

Java なんかだと,クラス定数に最大/最小値が定義されているけれど(MAX_VALUE / MIN_VALUE),C/C++ なんかではいちいち調べなくちゃいけなくて面倒くさかったりします。しかも,こゆのは,厳密にいうと処理系依存になってしまうので,ぐぐったところであまり役に立たなかったりもする(実際に調べてみないと分からない)。

ここでは,こんな感じで確かめました。

#include <iostream>

int
main(int argc, char* argv[]) {
    unsigned char  cn = ~0;
    unsigned int   in = ~0;
    unsigned long  ln = ~0;
    unsigned short sn = ~0;
    unsigned long long lln = ~0;
    signed char  scn_max = (cn >> 1);
    signed char  scn_min = (cn >> 1) + 1;
    signed int   sin_max = (in >> 1);
    signed int   sin_min = (in >> 1) + 1;
    signed long  sln_max = (ln >> 1);
    signed long  sln_min = (ln >> 1) + 1;
    signed short ssn_max = (sn >> 1);
    signed short ssn_min = (sn >> 1) + 1;
    signed long long slln_max = (lln >> 1);
    signed long long slln_min = (lln >> 1) + 1;

    std::cout << "char size            : " << sizeof(cn) << std::endl;
    std::cout << "unsigned char        : " << (int)cn << std::endl;
    std::cout << "signed char max      : " << (int)scn_max << std::endl;
    std::cout << "signed char min      : " << (int)scn_min << std::endl;

    std::cout << "int size             : " << sizeof(in) << std::endl;
    std::cout << "unsigned int         : " << in << std::endl;
    std::cout << "signed int max       : " << sin_max << std::endl;
    std::cout << "signed int min       : " << sin_min << std::endl;

    std::cout << "short size           : " << sizeof(sn) << std::endl;
    std::cout << "unsigned short       : " << sn << std::endl;
    std::cout << "signed short max     : " << ssn_max << std::endl;
    std::cout << "signed short min     : " << ssn_min << std::endl;

    std::cout << "long size            : " << sizeof(ln) << std::endl;
    std::cout << "unsigned long        : " << ln << std::endl;
    std::cout << "signed long max      : " << sln_max << std::endl;
    std::cout << "signed long min      : " << sln_min << std::endl;

    std::cout << "long long size       : " << sizeof(lln) << std::endl;
    std::cout << "unsigned long long   : " << lln << std::endl;
    std::cout << "signed long long max : " << slln_max << std::endl;
    std::cout << "signed long long min : " << slln_min << std::endl;

    return 0;
}

まぁ,大体のプログラマさんは,こういったちょろっとした道具をいくつか取り揃えているもんなんですけどね。限界値については,これまでいちいちその場で調べていたので,知識の棚卸しがてらまとめておくことにしました。

こゆのをまとめたクラスを作っておくのもいいよなぁ……time_t の最大値(2038年用)とか,閏年の値とか,Windows でファイル名として使えない文字とかを集めたクラス。テストする時は,なるたけ楽したいんですけど,あまり効率的にできていない気がします。

Trackback
Trackback URL:
Ads
About
Search This Site
Ads
Categories
Recent Entries
Log Archive
Syndicate This Site
Info.
クリエイティブ・コモンズ・ライセンス
Movable Type 3.36
Valid XHTML 1.1!
Valid CSS!
ブログタイムズ

© 2003-2012 AIAN