Этот вопрос, предположительно, для языковых юристов.
Предположим, что подписанные и беззнаковые int имеют ширину 32 бита. Как указано в проекте n3337.pdf, 5.3.1.8,
(-(0x80000000u)) = 0x100000000u-0x80000000u = 0x80000000u
Но не могу найти ответ на вопрос: что будет одинарным минусом для со знаком 0x80000000? Это UB, реализация определена или ...?
Вопрос в основном о вычислениях во время выполнения.
Say
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 перед голосованием за дубликаты.)