Толстый Лорри: В общем, есть простой способ определить, чем является константа: неизменной переменной или эфемерным значением. Определить её в двух единицах компиляции и посмотреть, что будет. Int — не ругается ни один компилятор. Double — GNU не нравится, в Embarcadero даже есть в некоторых автоконвертированных из Delphi хедерах, посмотрите, как там определён NaN. Const char* не проверял, но и так понятно — если там строковый литерал, то точную цифру вычислит не компилятор, а линкер. Мне известно, что Clang отказывает в любом constexpr’е с указателями, даже если это reinterpret_cast.
Толстый Лорри: Double — зависит от компилятора: Embarcadero позволяет, GNU нет.
Со строковыми литералами, очевидно, в принципе нет, поскольку точную цифру выдаст только линкер.
В большинстве сложных устройств используется многозадачная ОС, основанная на Linux. Один процесс отказывает и отваливается, остальные продолжают работать. Вот я знаю один маршрутизатор — в целом надёжный, но можно заглючить сервер печати. Свою работу как маршрутизатора он выполнял, зато переставал печатать.
Zzzz9: Во всех роутерах, которые я видел, была ОС. А вот в игровых приставках типа Dendy или PlayStation1 её не было. Как правило, её нет и в периферийных устройствах вроде клавиатур и мышей.
И да тогда скажите мне почему из двух signed int и unsigned int, победа будет на стороне unsigned int (то есть один тип будет приведен к другому типу при выполнении какой-либо арифметической операции)?
Таков уж стандарт. Как только появляется unsigned, все дальнейшие результаты unsigned.
Стандарт Си, 3.4.3.1. «An example of undefined behavior is the behavior on integer overflow».
Стандарт LIA, 5.1.1.1. For integer operations, this document does not specify continuation values for overflow when hasinfI = false nor the continuation values for invalid. The binding or implementation must document the continuation value(s) used for such cases (see Clause 8)
maxim_01: Компиляторы под x86 не реализуют аварий, и им, извини, похрѣнъ. Си появился за пять лет до 86-х процессоров.
Авария — это когда программа отходит от своего нормального хода при переполнении — через прерывание, сигнал, исключение или что-нибудь ещё.
−128 − 1 = −129, если ты не на компьютере считал, а учился в школе!
А 127 — это последствия арифметического переполнения.
На x86 отрицательные числа реализованы дополнительным кодом, это приводит к тому, что знаковый плюс и беззнаковый плюс — одна и та же операция. Плюс проверка арифметических переполнений требует телодвижений каждый раз, когда складываем-вычитаем (операции jc/jnc, jo/jno) — так что никто эти переполнения не проверяет.
Я полагаю, что это связано с машинами, где авария арифметического переполнения реализована менее накладным способом. Например, через прерывания, как деление на ноль в x86.
template <const char* X>void test() {}
Я так и не придумал, как этот шаблон расшаблонить.