В соответствии с этот, целочисленные литералы без суффикса типа всегда int
s. Тем не менее, и GCC и Clang интерпретировать 0xffffffff
(или любой литерал, который явно устанавливает бит знака, кроме использования -
) как без знака. Что правильно? (в соответствии с этот компиляторы есть)
Согласно пункту 2.14.2 / 2 стандарта C ++ 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
,Других решений пока нет …