Почему приведение типов от «int» к «float» снижает мое значение вдвое?

0

Я тестировал кастинг типов в C++ сегодня после просмотра прошлой викторины и не мог на всю жизнь понять, почему значение "x" изменяется от 9 до 4.5000 в следующем коде.

int main(){
    int x = 9, y = 2;
    float z;
    z = (float)x/(float)y;
    printf("\n%f", z);
    printf("\n%f", x);
    printf("\n%d", x);
}

Выходы

4.5000
4.5000
9

Буду признателен за любую помощь!

  • 7
    Ваш код имеет неопределенное поведение. Это UB, чтобы дать printf тип переменной, который не соответствует формату. Вы даете printf int , но обманываете его, говоря, что это тип float .
  • 1
    Увеличьте уровень предупреждения на вашем компиляторе, он автоматически найдет такую ошибку. Для gcc используйте -Wformat (который включен в -Wall ).
Показать ещё 1 комментарий
Теги:
casting

3 ответа

8

Функция printf ожидает, что float будет в стеке (из-за %f), и вы предоставили только int.

В этом случае вам нужно указать x в float:

printf("\n%f", (float)x);
  • 0
    Это на самом деле ожидание double (к которому в этом случае автоматически float аргумент float ).
6

В printf("\n%f", x) с int x вы не бросаете x в float - вы принимаете его как float. Это похоже на то, чтобы вручить пожарнику палочку с маслом и сказать ему, что это огнетушитель, - не будет работать правильно.

Чтобы выполнить бросок, вам нужно либо присвоить значение переменной, совместимой с литой:

float floatX = x;
printf("\n%f", floatX);

или использовать оператор трансляции:

printf("\n%f", (float)x);
  • 0
    Разве va_arg(args, double) в printf приводит аргументы к двойному значению? Или же???
  • 1
    @ Брэндон нет, даже близко
Показать ещё 2 комментария
0

Это не сокращение вашего X пополам. посмотрите на код ниже, он все еще печатает 4.5

#include <stdio.h>

int main(){
    int x = 9, y = 2;
    float z;
    z = (float)x/(float)y;
    x = 15;
    printf("\n%f", z);
    printf("\n%f", x);
    printf("\n%d", x);
}

это печатает:

4.500000
4.500000
15

Может быть, это должно быть сделано внутренне с тем, как float и ints хранятся в стеке. Его fishy, потому что его первое значение float, которое хранится. Если я изменю код на это:

#include <stdio.h>
using namespace std;

int main(){
    int x = 11, y = 2;
    float z;
    z = (float)x/(float)y;
    x = 15;
    printf("\n%f", z);
    printf("\n%f", x);
    printf("\n%d", x);
}

выход

5.500000
5.500000
15

Если вы не печатаете переменную z, тогда выход будет

0.000000
15

Возможно, это связано с порядком печати.

  • 0
    Нет гарантии, что программа даже завершит второй printf без сбоев. UB.
  • 0
    @PaulMcKenzie, если второй printf падает, как он может напечатать третий?
Показать ещё 9 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню