с плавающей точкой — приведение между различными типами данных в переполнении стека

Работая над приведением между различными типами данных в C ++ … Программа, приведенная ниже, печатает:

>"Number is 2">"Number is 2.5">"Number is 2"

Пожалуйста, объясните, почему последняя распечатка не «Number is 2.5», которую я ожидал бы после того, как приведение типа C ++ всплыло?

#include <iostream>
#include <conio.h>
using namespace std;

int main() {

int iNumber = 5;
float fNumber;

// No casting - C++ implicitly converts the result into an int and saves into a float
// which is a conversion from 'int' to 'float' with possible loss of data
fNumber = iNumber / 2;
cout << "Number is " << fNumber << endl;

// C-style casting not recommended as not type safe
fNumber = (float) iNumber / 2;
cout << "Number is " << fNumber << endl;

// C++ style casting using datatype constructors to make the casting safe
fNumber = static_cast<float>(iNumber / 2);
cout << "Number is " << fNumber << endl;

_getch();

return 0;
}

0

Решение

Заявление

fNumber = static_cast<float>(iNumber / 2);

делит целое число на целое число ДО приведения к числу с плавающей точкой. Это приводит к следующим шагам:

  1. Делить int iNumber от int 2 -> приводит к int 2
  2. Приведите результат в число с плавающей точкой -> результат с плавающей точкой 2.

Если вы вместо этого сделаете:

fNumber = static_cast<float>(iNumber / 2.0);

Теперь результатом деления будет плавающий тип 2.5 перед кастом, и вы должны получить 2.5, как и ожидалось.

Это все хорошо, но тогда почему

fNumber = (float) iNumber / 2;

Работа? Это потому, что вы кастуете iNumber в число с плавающей точкой ДО операции деления, поэтому и здесь вы делите число с плавающей точкой на целое число, и результатом будет число с плавающей точкой 2,5.

2

Другие решения

static_cast<float>(expression) ожидает выражение в скобках, скобки которого будут определять порядок операций.

Чтобы эффективно преобразовать int в число с плавающей точкой без потери данных в стиле C ++, нужно переписать третье выражение с круглыми скобками iNumber один, как в fNumber = static_cast<float>(iNumber) / 2; в итоге распечататьNumber is 2.5«:

  • iNumber брошен плавать,
  • 2 неявно приведен к 2.0 а также
  • iNumber делится на 2.0,

Обратите внимание, что круглые скобки, определяющие порядок операций, расположены вокруг типа данных в C, но вокруг переменной в C ++.

-1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector