A short int isn't a guaranteed 16 bits any more than a 'regular' int is. It's only guaranteed to be no shorter than 16 bits, and no longer than 'int' for the same compiler.
And a long isn't guaranteed to be longer than an 'int' -- just no shorter than 32 bits, and no shorter than an 'int' on the same compiler.
If you want portability, you have to make sure that your code won't break when you exceed 0x7fff (not 100000) in an integer _or_ a short, and you won't be guaranteed that your particular implementation will provide a check unless you -- check.
I can't think of code that is less portable than code that won't even compile.
These I could maybe see as being useful -- but they also violate your condition on the use of 'int', that they may be bigger than expected.
Until some bozo defines them to make some otherwise perfectly portable code compile because some other character used int16 or int8 because they thought it would be cool.
I'm sorry. What I see here is even more reasons to avoid 'int_xx' types like the plague. I can see some value in 'int_least_xx' and 'int_fast_xx', but not much that I can't get from 'char', 'short', 'int' and 'long'.