Как "E/e" в шестнадцатеричной форме дифференцируется от "E/e" в экспоненциальной форме в шестнадцатеричном литерале с плавающей запятой?

В C, если я хочу, чтобы литерал с плавающей точкой x был в шестнадцатеричной форме и имел экспоненциальное значение, он будет обозначаться следующим образом:

float x = 0X2aE+10;

Где используется 0x, чтобы обозначить его в шестнадцатеричном виде, а 2a для шестнадцатеричных символов, а E + 10 для числа в десять до десяти. Однако компилятор знает, что это не 2aE, представляющий шестнадцатеричные цифры (поскольку hexadecimal использует a для e для 10-15), а +10 просто добавляет десять к числу? И если это не так, то какое исправление?

Ответы

Ответ 1

0X2aE+10 - допустимый токен препроцессора, который не переводится в действительный токен C, следовательно, ошибка компиляции. C99 Шестнадцатеричные числа с плавающей запятой используют P или P в качестве маркера экспоненты, как в:

float x = 0X2aP+10;

Которая имеет значение 0x2a * 102443008.

Для тех, кто не знает о номерах предварительной обработки:

6.4.8 Номера предварительной обработки

Синтаксис

pp-number:
      digit
      . digit
      pp-number digit
      pp-number identifier-nondigit
      pp-number e sign
      pp-number E sign
      pp-number p sign
      pp-number P sign
      pp-number .

Описание

Номер предварительной обработки начинается с цифры, которой необязательно предшествует период (.), и за ней могут следовать действительные символы идентификатора и последовательности символов e+, e-, e+, e-, p+, p-, p+ или p-.

Лекции для предварительной обработки номеров лексически включают все маркеры с плавающей точкой и целые константы.

Семантика

Номер предварительной обработки не имеет типа или значения; он приобретает как после успешного преобразования (как часть фазы перевода 7), так и в токен с плавающей константой или токен цельной константы.

Ответ 2

Если вы видите, например, эта ссылка на литерал с плавающей запятой вы увидите, что для шестнадцатеричных значений с плавающей запятой требуется указатель p или p для обозначения экспоненты.

Итак, определение должно выглядеть как

float x = 0X2ap10;

Ответ 3

Hex floats использует p в качестве маркера экспоненты:

float x = 0x2ap+10;

Это фактически значение double. Если вам нужен литерал float, вам понадобится суффикс f:

float x = 0x2ap+10f;