Почему 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
.