Этот вопрос якобы для языковых юристов.
Предположим, что signed и unsigned int имеют ширину 32 бита. Как указано в проекте n3337.pdf, 5.3.1.8,
(-(0x80000000u)) = 0x100000000u-0x80000000u = 0x80000000u
Но не могу найти ответ на вопрос: какой будет унарный минус для signed 0x80000000? Это UB, реализация определена или...?
Вопрос в основном касается расчета во время выполнения.
Сказать
signed int my_minus(signed int i) { return -i;}
....
int main() {
signed int a = -0x7FFFFFFF; // a looks like 0x80000001
signed int b = a - 1; // b looks like 0x80000000
std::cout << my_minus(b);
....
}
Тем не менее, ваши комментарии по другим 2 случаям приветствуются:
Сворачивание констант времени компиляции, скажем,
-(INT_MIN)
Вычисление
constexpr
во время компиляции (если есть разница со свертыванием констант во время компиляции).
(Пожалуйста, посмотрите https://meta.stackexchange.com/questions/123713/is-splitting-a-question-a-good-practice перед голосованием за дубликат. )