g++ test.cpp -o test.exe -Wall
test.cpp: In function 'int main()':
test.cpp:8:12: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
if(test_1 < test_2)
-Wall does not turn on all the warnings, compile with at least -Wall -Wextra -pedantic-errors
Also have a read of the manual, there are specific warnings about these things, and narrowing. I don't remember if the sign comparison is part of the options I mentioned. The narrowing one isn't included unless one specifically mentions it. There are other that could come in handy, like switch default.
I'm no expert in assembly, but what I think is broadly happening here is an extra conversion. It's converting both the unsigned short and short to int. After the conversion, there's no comparisons between signed and unsigned ints, because both are converted to signed before the comparison.
Integer types smaller than int are promoted when an operation is performed on them. If all values of the original type can be represented as an int, the value of the smaller type is converted to an int; otherwise, it is converted to an unsigned int. Integer promotions are applied as part of the usual arithmetic conversions to certain argument expressions; operands of the unary +, -, and ~ operators; and operands of the shift operators.
Hope that clears it up a bit. I would be interested to see if the warning happens on compilers that are said to be better about warnings, like clang.