Almost everyone in this thread has either no idea what they are talking about, or they are purposely hiding details / simplifying things for you in order to keep it simple. Since I like doing neither of those things, I'll follow my disclaimer by a few quotations and why they are wrong.
Disclaimer:
Please do not take it personally if I quoted you, it just means that either what you wrote isn't factually correct, that you made a simple mistake, or that I'm being overly fucking pedant about it. No need to quote me and say "Oh I knew but <X> !!!". I'm human and I'll probably fuck up in this post too, don't take it personally if you do. Integral types' size in C++ is source of much confusion, so I tend to give a lot more detail than necessary to people who take the time to ask for clarification about the subject. So here we go.
Myth number one:
On most platforms a char is 1 byte
On all platforms, the size of char is defined to be large enough to hold any character of the implementation's basic character set. The signedness of a char is implementation defined, which means it could be either unsigned or signed. The statement is also wrong if you use byte as a generic term for 8 bits because in C++, a byte contains CHAR_BIT bits, not necessarily 8 (CHAR_BIT is in <climits>). The standard says that sizeof(char) must equal 1, it is not optional.
Myth number two:
short and long should be used only when there are special requirements for the size.
As others have mentioned here, types from the <cstdint> header should be used when you need specific bit sizes. Things like std::uint32_t are the way to go if you want to be sure to have 32-bits. Personally, I recommend using boost's cstdint header rather than your compiler's. It will reuse the latter's header if it makes sense to do so, so you gain a little bit of portability.
Myth number three:
Longs will almost never be used. There are only very extreme scenarios where you would ever have to actually use a long, due to the very nature of such extreme numbers.
Okay, just to be clear, on most platforms long is typedef'd to int. In the C++ standard, here are a few key sentences:
"There are five standard signed integer types : “signed char”, “short int”, “int”, “long int”, and “long long int”. In this list, each type provides at least as much storage as those preceding it in the list." - C++ standard
So while the size of an integer type isn't really explicitly defined, you can be assured that a short is at least as big as a char, and an int is at least as big as a short, etc. Long long int is from C++11, that's the standards document I'm using at the moment but you'll find that C++03 is the same way.
"Plain ints have the natural size suggested by the architecture of the execution environment[44]; the other signed integer types are provided to meet special needs." - C++ standard
"44) that is, large enough to contain any value in the range of INT_MIN and INT_MAX, as defined in the header <climits>" - C++ standard
"Maximum value for an object of type int INT_MAX +32767" - C standard
"Their implementation-defined values shall be equal or greater in magnitude (absolute value) to those shown, with the same sign."
The last sentence allows larger integers than 16-bit ones.
Only use chars if you know, for certain, your numbers won't be going above 255,
No, don't. Use std::uint8_t. char's signedness means that on certain compilers, you will overflow if you assume the above.
Myth number four:
Use int and char, and then use stdint.h for size specific stuff.
This should read "Jookia is a fucking badass" because it's the simplest and most relevant piece of advice in this thread. However it's half a myth because you should use <cstdint> instead of <stdint.h> because the latter is deprecated and should not be used.
Myth number five:
Also, longs and ints don't really impact "file size" of a program.
This is wrong because of const values, which may be put in a read-only section of your executable, increasing its size.
Myth number six:
Int should be fine for pretty much anything, just consider the limits of them if you start getting strange numerical errors.
Consider the limit ints have every single time you think it will be a problem. Don't wait for your program to throw errors, think about what the variable could hold and plan consequently. He's somewhat right in the sense that you shouldn't stress yourself with it either; int will do fine for 99% of purposes. But be careful.