Предоставляет ли С++ какой-либо целочисленный литерал неявно преобразован в короткий int?

int main()
{
    short n1 = 8ll; // no warning

    // warning C4305: 'initializing': truncation from '__int64' to 'short'
    // warning C4309: 'initializing': truncation of constant value
    short n2 = 88888ll;
}

Мой компилятор - это Visual Studio 2017.

Согласно cppref:

Тип целочисленного литерала - это первый тип, в котором значение может поместиться из списка типов, зависящих от того, какая числовая база и какой целочисленный-суффикс был использован.

Integer литерал с суффиксом ll должен иметь значение long long int; поэтому short n1 = 8ll должно вызывать предупреждение, подобное short n2 = 88888ll.

Предоставляет ли С++ любой целочисленный литерал неявно преобразован в short int, если он достаточно мал?

Ответ 1

Стандарт допускает неявное преобразование между любыми двумя целыми типами независимо от их значений.

Предупреждения компилятора не связаны с законным кодом; компилятор просто предупреждает вас, когда ваш код, вероятно, не делает то, что вы хотели.

В вашем конкретном случае n1 будет равно 8, а n2 будет иметь определенное значение реализации. Оба назначения являются законными С++, но последнее, вероятно, не то, что вы намеревались.


Соответствующий стандарт:

Значение целочисленного типа может быть преобразовано в prvalue другого целочисленного типа. Значения незавершенного тип перечисления может быть преобразован в prvalue целочисленного типа.
Если тип назначения не указан, результирующее значение представляет собой наименьшее целое число без знака, сравнимое с источником integer (по модулю 2 n где n - количество бит, используемых для представления неподписанного типа). [Примечание: в два раза это преобразование является концептуальным, и в битовой схеме нет изменений (если есть не является усечением). - конечная нота]
Если тип назначения подписан, значение не изменяется, если оно может быть представлено в типе назначения (и ширина битового поля); в противном случае значение определяется реализацией.

4.7/1-3 в N4141

Ответ 2

Да, целые числа могут быть преобразованы неявно. Это правила из стандартного черновика С++ N4296:

4.7 Интегральные преобразования
1 Значение целочисленного типа может быть преобразовано в prvalue другой целочисленный тип. Значение типа неперечисленного перечисления может быть преобразуется в prvalue целочисленного типа.
2 Если тип назначения без знака, результирующее значение представляет собой наименьшее целое без знака конгруэнт к исходному целому (по модулю 2 n где n - число биты, используемые для представления неподписанного типа).
[Примечание: в два раза это преобразование является концептуальным, и существует без изменения битовой диаграммы (если нет усечения). -end note]
3 Если тип назначения подписан, значение не изменяется, если оно может быть представлены в типе назначения; в противном случае это значение равно реализации.
4 Если тип назначения - bool, см. 4.12. Если тип источника - bool, значение false преобразуется в ноль и значение true преобразуется в единицу. 5 Переходы, разрешенные как интегральные поощрения исключаются из набора интегральных преобразований.