If the *shift count* value is a **negative value** then both *left shift* and *right shift* operations are undefined^{1}:

```
int x = 5 << -3; /* undefined */
int x = 5 >> -3; /* undefined */
```

If *left shift* is performed on a **negative value**, it's undefined:

```
int x = -5 << 3; /* undefined */
```

If *left shift* is performed on a **positive value** and result of the mathematical value is **not** representable in the type, it's undefined^{1}:

```
/* Assuming an int is 32-bits wide, the value '5 * 2^72' doesn't fit
* in an int. So, this is undefined. */
int x = 5 << 72;
```

Note that *right shift* on a **negative value** (.e.g `-5 >> 3`

) is *not* undefined but *implementation-defined*.

^{1} Quoting *ISO/IEC 9899:201x*, section 6.5.7:

If the value of the right operand is negative or is greater than or equal to the width of the promoted left operand, the behavior is undefined.