変数に放り込める最大値を知る。

unsignedな変数ならsignedにキャストして-1を放り込んでunsignedに戻せば達成できます。*1
ですが、コンパイラに付属のヘッダファイルから直値で知れればそっちの方が処理速度は上がります。
ってことで、各変数に放り込める最大値がマクロで定義されているのでその取得方法。

#include <iostream>
#include <climits>

int main(){
    std::cout << "charのビット数: " << CHAR_BIT << std::endl;
    std::cout << "多バイト文字の最大バイト数: " << MB_LEN_MAX << std::endl;
    std::cout << "charの最大値: " << CHAR_MAX << std::endl;
    std::cout << "charの最小値: " << CHAR_MIN << std::endl;
    std::cout << "signed charの最大値: " << SCHAR_MAX << std::endl;
    std::cout << "signed charの最小値: " << SCHAR_MIN << std::endl;
    std::cout << "unsigned charの最大値: " << UCHAR_MAX << std::endl;
    std::cout << "short intの最大値: " << SHRT_MAX << std::endl;
    std::cout << "short intの最小値: " << SHRT_MIN << std::endl;
    std::cout << "unsigned short intの最大値: " << USHRT_MAX << std::endl;
    std::cout << "intの最大値: " << INT_MAX << std::endl;
    std::cout << "intの最小値: " << INT_MIN << std::endl;
    std::cout << "unsigned intの最大値: " << UINT_MAX << std::endl;
    std::cout << "long intの最大値: " << LONG_MAX << std::endl;
    std::cout << "long intの最小値: " << LONG_MIN << std::endl;
    std::cout << "unsigned long intの最大値: " << ULONG_MAX << std::endl;
    return 0;
}

Cでこれらを利用するときは limits.h をインクルードする。

*1:負数を2の補数で表現するCPUでは-1で全てのビットが反転するため。将来的にこれ以外の手法で負数を表現するCPUが出てきたら使えない。