integer — является литералом 0xffffffff int или без знака в переполнении стека

В соответствии с этот, целочисленные литералы без суффикса типа всегда ints. Тем не менее, и GCC и Clang интерпретировать 0xffffffff (или любой литерал, который явно устанавливает бит знака, кроме использования -) как без знака. Что правильно? (в соответствии с этот компиляторы есть)

23

Решение

Согласно пункту 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,
25

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]