В вашей реализации C ++, y = 7000000000*1.0
и y = 7000000000
приводят к переполнению того, что представляется в int
во время преобразования. Для преобразования из типа с плавающей точкой в целочисленный тип поведение в случае такого переполнения не определяется стандартом C ++. Для преобразования из одного целочисленного типа в другой он определяется реализацией.
Однако ваш компилятор диагностирует последний во время компиляции и не может диагностировать первый. Это не означает, что с первым все в порядке (это не так), просто компилятор не сообщает о проблеме (и не требуется в соответствии со стандартом C ++).