Как вы используете новую особенность размера Clang Int? - PullRequest
1 голос
/ 24 апреля 2020

Недавно я слышал, что у clang появилась новая функция, _ExtInt. Я знаю, что он позволяет вам указать размер целого числа (нечетное или даже как 13-битное целое), но как вы его используете?

1 Ответ

3 голосов
/ 24 апреля 2020

_ExtInt должен использоваться как обычный спецификатор. Например:

_ExtInt(13) foo;

Здесь вы объявили, что foo состоит из 13 битов. Не забывайте ставить ключевые слова типа short или long перед ним (потому что это не имеет смысла), хотя вы можете поставить signed или unsigned (signed по умолчанию). Обратите внимание, что вам не разрешено делать такие вещи, как; _ExtInt(5) + _ExtInt(6). Согласно этому веб-сайту, это происходит потому, что:

В документе WG14 предлагается целочисленное продвижение к крупнейшим из типов (то есть добавление _ExtInt (5) и _ExtInt ( 6) приведет к _ExtInt (6)), однако реализация этого не допускает, а _ExtInt (5) + _ExtInt (6) приведет к ошибке компилятора. Это было сделано для того, чтобы в случае, если WG14 изменит дизайн документа, мы сможем реализовать его, не ломая существующие программы.

Это можно обойти, используя приведение:

(_ExtInt(6))AnExtInt5 + AnExtInt6 or static_cast<ExtInt(6)>(AnExtInt5) + AnExtInt6

Не только это, но если вы используете c ++, вы можете делать некоторые действительно сумасшедшие вещи:

template<size_t WidthA, size_t WidthB>
  _ExtInt(WidthA + WidthB) lossless_mul(_ExtInt(WidthA) a, _ExtInt(WidthB) b) {
  return static_cast<_ExtInt(WidthA + WidthB)>(a) 
       * static_cast<_ExtInt(WidthA + WidthB)>(b);
} 

Смотрите здесь для получения дополнительной информации.

Дополнительные примечания :

  • Значение int, добавленное к _ExtInt(32), будет int.
  • Ваш размер int может go up 1 до 16,777,215 бит.

Примечание: Чтобы использовать эту функцию, вам потребуется последняя версия clang, так как изменение было сделано 4/21 / 2020.

...