я не могу найти где-нибудь в стандарте C, что оправдывает следующее:Есть ли механизм в C11 для обеспечения ожидаемых типов отрицательных целых констант?
int n = -0x80000000 // set n to -2^31
Предположим, реализация которых ИНТ составляет 32 бита. Очевидная проблема состоит в том, что целочисленная константа имеет тип unsigned int, согласно таблице в стандарте проекта комитета в пункте 6.4.4.1 пункта 5. Затем отрицание рассчитывается в соответствии с пунктом 6.5.3.3, пункт 3:
Результат унарного оператора является отрицательным его (продвинутым) операндом. Целые рекламные акции выполняются в операнде, и результат имеет продвинутый тип.
Выполнение целочисленных рекламных акций не изменяет тип (unsigned int остается без знака int). Затем берется отрицание. Так как результат сохраняет продвинутый тип, он уменьшается по модулю 2^32, производя 2^31 (так что отрицание не имеет эффекта).
Назначение отказа от значения диапазона к типу Int покрывается следующее:
6.3.1.3 Подпись и целые числа без знака
1 Когда значение с целочисленным типом преобразуется в другой целочисленный тип другой чем _Bool, если значение может быть представлено новым типом, оно не изменяется.
2 В противном случае, если новый тип без знака, значение преобразуется путем многократного добавления или вычитания больше, чем максимальное значение, которое может быть представлено в новом типе , пока значение находится в диапазоне от нового типа один , 60)
3 В противном случае новый тип подписан и его значение не может быть представлено; либо результат определяется реализацией или повышается сигнал, определяемый реализацией.
Итак, в конце мы получим реализацию, определенную реализацией, когда мы пытаемся присвоить действительное значение int объекту int (предполагая дополнение 2 без представления ловушки).
Ниже будет стандартной гарантированно иметь ожидаемый результат:
int n = -(long long)0x80000000 // set n to -2^31
Таким образом, вы действительно должны бросить до правомерно сделать присваивание диапазона, или я что-то отсутствует?
Примечание о стандарте, гарантированном ожидаемом результате, -> отзыв 'int' может быть 16-бит. – chux
Да, я предполагаю 32-битный int. – Kyle
Проблема на самом деле проста, не используйте hex для описания значений, которые могут стать отрицательными. Значения шестнадцатеричных значений являются хорошим инструментом, когда вы хотите описать битовые шаблоны, которые будут использоваться как маски в битовых операциях и так далее. Когда вы хотите описать значения для подписанной арифметики, представление битов должно быть неактуальным. –