Bit shift operators act on entire objects, not individual bytes. If the object storing 69 is wider than 1 byte (int is typically 4 bytes for example), then the bits that are shifted outside of the first (lowest/rightmost) byte overflow and are "pushed into" the second byte. For example:
00000000 00000000 00000000 01000101 //The number 69, stored in a 32 bit object 00000000 00000000 01010000 00000000 //shifted left by 8
If you had stored the number in a 1-byte variable, such as a char, the result would indeed have been zero.
01000101 //The number 69, stored in an 8 bit object (01000101) 00000000 //shifted left by 8 ^^^^^^^^ these bits have been shifted outside the size of the object.
The same thing would happen if you shifted an int by 32.
00000000 00000000 00000000 01000101 //The number 69, stored in a 32 bit int 00000000 00000000 01010000 00000000 //shifted left by 8 00000000 01010000 00000000 00000000 //shifted left by 16 01010000 00000000 00000000 00000000 //shifted left by 24 00000000 00000000 00000000 00000000 //shifted left by 32, overflow
intprecision