Какая разница между усечением и сужением?
Усечение сокращает десятичное значение, такое как float
или double
, до его интегральная форма int
с битами дополнительной точности после удаления десятичной дроби (от 2 -1 в соответствующей десятичной форме).
A double
может быть усечено до float
также с возможностью переполнения (в зависимости от размера значения) и удаления половины битов точности в его двоичной форме (поскольку double имеет удвоенную точность с плавающей запятой, причем они обычно равны 64 и 32-битным плавающим точкам соответственно ).
Для примера усечения double
в float
рассмотрим что-то, что идет по крайней мере выше 23 прецизионных бит (с учетом мантиссы с плавающей запятой), такое как значение PI, относительно которого BenVoigt привел пример в комментариях.
Значение PI, заданное двойным, равно:
11.001001000011111101101010100010001000010110100011000
// 3.141592653589793116
Обратите внимание, что имеется 52 прецизионных бита (согласно стандарту IEEE 754, от 0 до 51), или биты, формирующие значение после десятичного числа.
Соответствующее усеченное значение с плавающей запятой:
11.0010010000111111011011
// 3.1415927410125732422
Обратите внимание на неточность значения PI в относительном выражении числа, рассмотренного выше. Это вызвано удалением конечных битов точности при усечении значения с double
до float
(в котором только 23 прецизионных бита, от 0 до 22), что обычно уменьшает точность битов в этом случае.
После преобразования значений с плавающей запятой в целочисленную форму можно сказать, что он действует подобно вызову функции floor
.
Сужение означает сокращение значения в качестве имени также подразумевает, но в отличие от усечения это не ограничивается сокращением значения с плавающей запятой до целочисленного значения. Это относится и к другим преобразованиям, таким как long
в int
, тип указателя на логическое значение и символ в целое число (как в вашем примере).