Позволяет ли C++ неявно преобразовывать любой целочисленный литерал в короткий 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:

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

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

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

2 ответа

Решение

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

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

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


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

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

4,7/1-3 в N4141

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

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

Другие вопросы по тегам