Позволяет ли 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 Преобразования, разрешенные как интегральные продвижения, исключаются из набора интегральных преобразований.