Подтвердить что ты не робот

Является литеральный 0xffffffff int или unsigned в С++

Согласно this, целые литералы без суффикса типа всегда int s. Однако как gcc, так и clang интерпретируют 0xffffffff (или любой литерал, который явно устанавливает знаковый бит, отличный от использования -), как unsigned. Что правильно? (согласно это компиляторы)

4b9b3361

Ответ 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.