2013-06-17 2 views
2

рассмотреть программуРассмотрим вывод программы

#include<stdio.h> 
int main() 
{ 
    int x = 33; 
    float y = 5; 

    printf("%d %d",y,x); 
    return 0; 
} 

Выход:

0 1075052544 

Я могу понять значение у наступающем 0, как UB, но у х приходит так? Here - образец идеона.

+0

Поскольку% d ожидает, что int не является float, используйте% f для поплавков. – hetepeperfan

+0

Ну, как только у вас есть UB, все может случиться. Но знаете ли вы, что 'float' продвигается до 'double', когда передается' printf'? –

+0

их повышают вдвое? как ? пожалуйста, уточните @DanielFischer – akash

ответ

7

После того, как вы неопределенное поведение, все позволено случиться, так что вы не можете ожидать, ничего толкового после печати с неправильным спецификатором преобразования.

Однако в этом случае мы можем восстановить то, что, вероятно, произошло.

printf является вариационной функцией, поэтому ее аргументы подвергаются рекламным акциям по умолчанию. Это означает, что аргументы float рекламируются до double до их передачи в printf.

IEEE754 double представление 5 является

0x4014000000000000 

кодирующий знак-бит 0, показатель степени 2 + 1023 = 1025 = 0x401 и мантиссу из 5/4, который, удаляя скрытые 1 бит становится 0x4000000000000.

Отпечатанные значения: 0 и 1075052544 = 0x40140000. Они соответствуют 32-разрядным разрядам double 5 и 32-разрядным номерам высокого порядка соответственно.

+0

Блестящий мужчина! Шляпы выключены! – akash

1

Вы используете неверное форматирование для y которое является поплавком. В printf «% d» для целых чисел (int) и «% f» для данных с плавающей запятой (float).

Это правильный способ печати x и y (при условии х ИНТ и у с плавающей точкой):

printf("%f %d", y, x); 

Как x, это вероятно (я не совсем уверен) напечатаны неправильно потому что неверное форматирование используется для печати переменной до этого (y).

+0

, но не для x! – akash

+0

, что не имеет значения, я прошу x, и все отвечают за y! – akash

1

Использование %f для печати чисел с плавающей запятой

printf("%f %d",y,x); 
+0

хорошо, это хорошо, но почему x идет мусор, я использовал правильный спецификатор для него – akash

+0

После изменения '% d' на'% f' я помещаю этот код как есть в 'main.c', а затем запускал' gcc main.c; ./a.out', и мой результат был «5.000000 33'. Именно то, что вы ожидаете. Проблема может исходить от использования ideone. –

Смежные вопросы