я читал http://www.cplusplus.com/doc/tutorial/typecasting/. Это говорит о том, что:
В противном случае, если преобразование происходит между числовыми типами одного типа
(целое-целое или плавающее-плавающее), преобразование допустимо,
но значение зависит от реализации (и не может быть переносимым).
Но я действительно не понял, что означает вышеприведенная цитата? Кто-нибудь, пожалуйста, объясните это на простом примере? Почему преобразование между числовым типом одного и того же вида приводит к конкретному значению реализации? Какова причина?
Давайте рассмотрим следующий пример:
long long int lli = 5000000000;
long int li;
int i;
li = lli;
i = li;
Можете ли вы предсказать значения lli
, li
а также i
? Или будь li
а также i
имеют одинаковое значение?
Ответ — значения зависят от количества байтов, выделенных для каждого типа!
То есть для некоторых случаев int
равно long int
, для других long int
равно long long int
, а вообще long
Некоторые типы могут быть длиннее. Подобный (в смысле объема памяти) для float
, double
а также long double
,
Фрагмент относится к сужающимся преобразованиям между целочисленным типом и типом с плавающей запятой соответственно. То есть в нем говорится, что, хотя преобразование между целочисленными типами или между типами с плавающей запятой допустимо, результирующее значение будет определяться реализацией.
В качестве примера рассмотрим следующий фрагмент кода:
#include <iostream>
#include <limits>
int main() {
long long lgm = std::numeric_limits<long long>::max();
std::cout << std::hex << lgm << std::endl;
int i = lgm;
std::cout << std::hex << i << std::endl;
long double ldb = std::numeric_limits<long double>::max();
std::cout << std::hex << ldb << std::endl;
double db = ldb;
std::cout << std::hex << db << std::endl;
}
Выход:
7fffffffffffffff
ffffffff
1.18973e+4932
inf
Как вы можете увидеть максимальное значение long long
целое число превышает емкость простого целого числа. Однако вы можете конвертировать long long
для int
(т. е. преобразование действительно), но из-за того, что int
не может содержать максимальное значение long long
не может быть точного преобразования. Таким образом, значение полученного int
оставлено на усмотрение реализации. То же самое верно для преобразования между long double
а также double
,