Вы правы в том смысле, что ваш код делает именно то, что вы говорите, он должен делать. Реальный вопрос в том, хотите ли вы этого или нет.
Отрицательное число, приведенное к unsigned int, становится очень большим положительным числом. Например, отрицательное становится наибольшим положительным целым числом, которое может быть выражено в беззнаковом int после преобразования в unsigned (попробуйте!) Когда вы добавляете два отрицательных числа, которые были приведены к unsigned, вы гарантированно получите переполнение. Если это действительно то, что вы пытаетесь сделать, то ваш код определенно делает это.