Not true. In practice it usually works out that sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long) <= sizeof(long long). However, that is not actually a requirement in the standard.
The standard only requires that the set of values that can be represented by a char is a subset of the values that can be represented by a short, which in turn is a subset of the values that can be represented by a short .....
The C standard only talks about the ranges of values that can be represented. It does not make reference to sizeof() at all in discussing storage of a value in an integral (or any other) type.
Part of the ambiguity is that the word "storage" can mean "representing a value using a variable" as well as "allocating memory".
Code://try //{ if (a) do { f( b); } while(1); else do { f(!b); } while(1); //}