Согласно this, целые литералы без суффикса типа всегда int s. Однако как gcc, так и clang интерпретируют 0xffffffff (или любой литерал, который явно устанавливает знаковый бит, отличный от использования -), как unsigned. Что правильно? (согласно это компиляторы)
Является литеральный 0xffffffff int или unsigned в С++
Ответ 1
В абзаце 2.14.2/2 стандарта С++ 11,
Тип целочисленного литерала является первым из соответствующего списка в таблице 6, в котором его значение может быть представлены.
В таблице 6 сообщается, что для шестнадцатеричных констант тип должен быть:
-
int; или (если он не подходит) -
unsigned int; или (если он не подходит) -
long int; или (если он не подходит) -
unsigned long int; или (если он не подходит) -
long long int; или -
unsigned long long int.
Предполагая, что ваша реализация имеет 32-разрядный int, поскольку 0xffffffff не подходит для int, его тип должен быть unsigned int. Для реализации с 64-разрядным int тип будет int.
Обратите внимание, что если бы вы написали тот же литерал, что и десятичная константа, тип мог бы быть только:
-
int; или (если он не подходит) -
long int; или (если он не подходит) -
long long int.