```c
uint32_t upper_bound = (uint32_t)INT32_MAX + (s <= 0);
```
This should do it.

(Why the is no error with INT16_MIN: 16 bit integers are promoted to 32 bit integers before applying the unitary `-`.)