#include <iostream>
#include <cmath>
#include <limits>
#include <string>
using namespace std;
/*******************************************
*Задача про максимальную величину типа int*
*(Программа не сцепленная с разрядностью) *
*******************************************/
template <class T> T findmax()
{
T r1=1; // именно на этой переменной мы будем использовать побитовое смещение
T k=1; // правильный ответ; Мы знаем что положительных чисел на 1 меньше чем отрицательных, так как одно значение знаимает нуль
T r=1; // это то самое число которое будет испытывать на себе поянную ануляцию, что и позволит нам выявиль границы типа
while( ( numeric_limits<T>::infinity() ? k*2 < numeric_limits<T>::infinity() : ((T)(k+1))>0 ) ) //елси это число имеет верхнюю границу, то удвенное k должно быть меньше чем этот предел(ибо k+1 будет давать нам вполне сносное значение(что для нас не приемлимо), поэтому я просто умножил на два чтобы наверняка), иначе: если при прибавлении единицы мы переходим границу возможных положительных чисел, то оно уж точно не будет больш нуля
{
r=k; // пустышку r мы снова приравниваем k
r1=1; // подготавливаем все к новому возведению в степень
for (;( numeric_limits<T>::infinity() ? (r<numeric_limits<T>::infinity()) : r >= k ) ;) //елси это число имеет верхнюю границу, то r должно быть меньше чем этот преде иначе: Выполняется пока число не переполнится и не станет меньше тени(k)
{
if( r>0 ) k=r;// первое присваивание мы пропускаем(не очень то и важно)
r += r1; // постоянно прибавляем степени
/*этот код дает такой эффект: вначале мы просто повышаем степень, а потом мы уже прибавляем к наивысшему числу которое нашла эта проверка степени */
/*то есть после первого возведения в степень типа int мы получим: 2^30, а потом к 2^30 прибавляется поочередно +1, +2, +4; если и так постоянно будет начинать заново, и в конце к переменной будет прибавляться +1 и +3, тем самым заполняя оставшееся место до максимального числа в ислучае int это 2^31-1*/
r1*=2;
}
}
return k;
}
int main(void)
{
string c;
cin >> c;
if(c == "char")cout << "Char=" << (int)findmax<char>() << endl;
else if(c == "unsigned char")cout << "uChar=" << (int)findmax<unsigned char>() << endl;
else if(c == "short")cout << "Short="<< findmax<short>() << endl;
else if(c == "unsigned short")cout << "uShort=" << findmax<unsigned short>() << endl;
else if(c == "int")cout << "Int=" << findmax<int>() << endl;
else if(c == "unsigned int")cout << "uInt=" << findmax<unsigned int>() << endl;
else if(c == "long")cout << "Long=" << findmax<long>() << endl;
else if(c == "unsigned long")cout << "uLong=" << findmax<unsigned long>() << endl;
else if(c == "long long")cout << "Long long int=" << findmax<long long int>() << endl;
else if(c == "unsigned long long")cout << "uLong long=" << findmax<unsigned long long int>() << endl;
else if(c == "float")cout << "Float=" << (float)(findmax<float>()) << endl;
else if(c == "double")cout << "Double=" << findmax<double>() << endl;
else if(c == "long double")cout << "Long Double=" << findmax<long double>() << endl;
else cout << "Нет такого типа" << endl;
return 0;
}