Согласно 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
.