Хорошо, но вы получите поведение, определенное реализацией, если значение без знака не может быть представлено в знаке (см., Например, this стандартный черновик c ++ онлайн):
4,7 Интегральные преобразования
3) Если тип назначения подписан, значение не изменяется, если оно может
быть представленным в типе назначения (и ширине битового поля);
в противном случае значение определяется реализацией.
Чтобы преодолеть это, вы можете ограничить старший байт до 7 бит:
sum = sum + (static_cast<std::uint32_t>(list[3]) & 0x7F) <<24;
if (static_cast<std::uint32_t>(list[3]) & 0x80) {
sum = -sum;
}
Обратите внимание, что только 31 бит может быть использован для содержимого подписанного значения.
На самом деле вы не можете полагаться на два представления дополнения, но с пометкой sum = -sum
вы должны быть в безопасности.