Почему 1 не больше -0x80000000

Почему 1 не больше -0x80000000. Я знаю, что это имеет какое-то отношение к переполнению. Но может кто-нибудь объяснить, почему? 0x80000000 Не константа Я думаю, что это?

assert(1 > -0x80000000);

Утверждающие триггеры в С++. Почему это?


Я благодарен за предоставленный ответ. Но определяет ли стандарт С++, что константа должна быть сохранена в 32-битном целом? Почему компилятор не признал, что 80000000 не подходит для 32-битного целого и использовать для него 64-битное? Я имею в виду, что наибольший 32-битный int может быть 0x7FFFFFFF. 0x80000000, очевидно, больше этого. Почему компилятор все еще использует 32 бит для этого?

Ответ 1

В соответствии со стандартами C и С++ -0x80000000 не является целочисленной константой. Это выражение, например 3 + 5. В этом случае это константа 0x80000000, на которой действует оператор отрицания. Для компиляторов, которые имеют 32-разрядный int s, 0x80000000 не представляется в виде int, но представляется как unsigned int. Но отрицание целого числа без знака (это странно) выполняется в неподписанном контексте. Таким образом, отрицание здесь эффективно не имеет эффекта.

Ответ 2

Один из способов исправить это - использовать тип, который, как вы знаете, может быть способен правильно представлять и сохранять ваше значение, что означает, что ваше выражение может быть исправлено так

assert(1 > -0x80000000L);

или

assert(1 > -0x80000000LL);

Что в основном связано с использованием стандартного суффикса в С++ для вашего предположительно целочисленного выражения.

Только 3 стандартных суффикса для целых типов в С++ - это u, l и ll, а также верхние регистры, которые означают то же самое, что и их нижний регистр; u, l и ll.