_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.