Почему основание литерала влияет на его тип? - PullRequest
0 голосов
/ 11 ноября 2018

Десятичное число 4294967295 равно шестнадцатеричному 0xFFFFFFFF , поэтому я ожидаю, что литерал будет иметь одинаковый тип независимо от того, в какой базе он выражен, но

std::is_same<decltype(0xFFFFFFFF), decltype(4294967295)>::value; //evaluates false

Похоже, что на моем компиляторе decltype(0xFFFFFFFF) равно unsigned int, а decltype(4294967295) равно signed long.

1 Ответ

0 голосов
/ 11 ноября 2018

шестнадцатеричные литералы и типы десятичных литералов определяются иначе, чем таблица lex.icon 7

Тип целочисленного литерала является первым из соответствующего списка в таблице 7 вкоторое может быть представлено его значением.

, когда не существует суффикса для десятичного литерала, перечисленные типы в следующем порядке:

целое число
long int
longlong int

для шестнадцатеричного числа список в следующем порядке:

int
без знака int
long int
без знака long int
long longint unsigned long long int

Почему существует эта разница?Учитывая, что у нас это тоже есть в C, мы можем взглянуть на обоснование C99 , где написано:

В отличие от десятичных констант, восьмеричные и шестнадцатеричные константы, слишком большие, чтобы их можно было набиратькак unsigned int, если в пределах диапазона этого типа, так как более вероятно, что они представляют битовые комбинации или маски, которые обычно лучше всего рассматривать как беззнаковые, а не как «реальные» числа.

...