Q:

fixed length data types in C/C++

I've heard that size of data types such as int may vary across platforms. 
My first question is: can someone bring some example, what goes wrong, when program
assumes an int is 4 bytes, but on a different platform it is say 2 bytes? 
Another question I had is related.  I know people solve this issue with some typedefs,
like you have variables like u8,u16,u32 - which are guaranteed to be 8bits, 16bits, 32bits, regardless of the platform -- my question is, how is this achieved usually? ( I am not referring to types from stdint library - I am curious manually, how can one enforce that some type is always say 32 bits regardless of the platform??) 

A:

I know people solve this issue with some typedefs, like you have variables like u8,u16,u32 - which are guaranteed to be 8bits, 16bits, 32bits, regardless of the platform 

There are some platforms, which have no types of certain size (like for example TI's 28xxx, where size of char is 16 bits).  In such cases, it is not possible to have an 8-bit type (unless you really want it, but that may introduce performance hit). 

how is this achieved usually? 

Usually with typedefs.  c99 (and c++11) have these typedefs in a header.  So, just use them. 

can someone bring some example, what goes wrong, when program assumes an int is 4 bytes, but on a different platform it is say 2 bytes? 

The best example is a communication between systems with different type size.  Sending array of ints from one to another platform, where sizeof(int) is different on two, one has to take extreme care. 
Also, saving array of ints in a binary file on 32-bit platform, and reinterpreting it on a 64-bit platform. 

A:

In earlier iterations of the C standard, you generally made your own typedef statements to ensure you got a (for example) 16-bit type, based on #define strings passed into the compiler for example:
gcc -DINT16_IS_LONG ...

Nowadays (C99 and above), there are specific types such as uint16_t, the exactly 16-bit wide unsigned integer. 
Provided you include stdint.h, you get exact bit width types,at-least-that-width types, fastest types with a given minimum widthand so on, as documented in C99 7.18 Integer types <stdint.h>.  If an implementation has compatible types, they are required to provide these. 
Also very useful is inttypes.h which adds some other neat features for format conversion of these new types (printf and scanf format strings). 

A:

For the first question: Integer Overflow. 
For the second question: for example, to typedef an unsigned 32 bits integer, on a platform where int is 4 bytes, use:
 typedef unsigned int u32;

On a platform where int is 2 bytes while long is 4 bytes:
typedef unsigned long u32;

In this way, you only need to modify one header file to make the types cross-platform.  
If there are some platform-specific macros, this can be achieved without modifying manually:
#if defined(PLAT1)
typedef unsigned int u32;
#elif defined(PLAT2)
typedef unsigned long u32;
#endif

If C99 stdint.h is supported, it's preferred.