Olá,
C++ é fortemente tipado, e sua pergunta ficou generica d+, mas vou tentar responder.
Imagina que os tipos para números no C++ são como "baldes", vc declara o "balde" para a quantidade de agua que vc quer colocar nele.
Se vc pegar o maior "balde" vc vai colocara quantidade máxima de agua, mas vai ter todo o desconforto de um "balde" grande para transportar quantidades pequenas de agua, vc quem decide pela escolha do balde. Essa mesma metafora serve para quantidades muito pequena de agua e "baldes" bem pequenos.
Esse programinha mostra o tamanho de alguns dos tipos existentes, mas existem mais:
#include <iostream>
int main()
{
std::cout << "Tipos" << std::endl;
std::cout << "short int: " << sizeof(short int) << " bytes;" << std::endl;
std::cout << "signed int: " << sizeof(signed int) << " bytes;" << std::endl;
std::cout << "signed short int: " << sizeof(signed short int) << " bytes;" << std::endl;
std::cout << "unsigned short int: " << sizeof(unsigned short int) << " bytes;" << std::endl;
std::cout << "int: " << sizeof(int) << " bytes;" << std::endl;
std::cout << "long int: " << sizeof(long int) << " bytes;" << std::endl;
std::cout << "signed long int: " << sizeof(signed long int) << " bytes;" << std::endl;
std::cout << "unsigned int: " << sizeof(unsigned int) << " bytes;" << std::endl;
std::cout << "unsigned long int: " << sizeof(unsigned long int) << " bytes;" << std::endl;
std::cout << "float: " << sizeof(float) << " bytes;" << std::endl;
std::cout << "double: " << sizeof(double) << " bytes;" << std::endl;
}
Você é livre para escolher o "balde" que quiser, essa é a liberdade, mas vem todo trabalho e resposábilidade pela escolha.
Não tenho nenhum link espesifico para isso, mas o Wiki pode ser um bom começo se for para começar pelo básico.
Espero ter pelo menos dado uma orientada no que querias saber.