[Ответить в тред] Ответить в тред

Тред закрыт.


09/10/16 - Открыта доска /int/ - International, давайте расскажем о ней!
30/09/16 - BREAKING NEWS ШОК АБУ ПРОДАЛСЯ МЭЙЛУ (на самом деле нет)
25/09/16 - Персональное обращение Абу - СБОР ПОЖЕРТВОВАНИЙ НА ДВАЧ



Новые доски: /2d/ - Аниме/Беседка • /wwe/ - WorldWide Wrestling Universe • /ch/ - Чатики и конфочки • /int/ - International • /ruvn/ - Российские визуальные новеллы • Создай свою

[Назад][Обновить тред][Вниз][Каталог] [ Автообновление ] 24 | 2 | 13
Назад Вниз Каталог Обновить

ДОЕБАЛСЯ ПРЕПОД Аноним 30/09/16 Птн 00:25:56  848494   Обсуждение закрыто  
14751843568440.png (11Кб, 379x313)
почему на выходе имеем нули вместо 732.00000???

мне всего то нужно понять как работает этот код, я не ставлю цель вывести переменную правильно, мне не нужны преобразования типов и проч. я хочу разобраться что происходит в принтэфе, как он выводит эту переменную, по сути он что %f, что %d должен брать со стека 4 байта но интерпритировать их по разному(тобишь целое или плавающее) но происходит то что я понять не могу
Аноним 30/09/16 Птн 00:54:26  848504
бамп
Аноним 30/09/16 Птн 00:58:28  848505
бамп
Аноним 30/09/16 Птн 00:58:48  848506
бамп
Аноним 30/09/16 Птн 01:15:40  848508
я ебал твою мать
Аноним 30/09/16 Птн 01:18:04  848509
14751874850500.jpg (51Кб, 400x307)
>>848504
>>848505
>>848506
Анус себе бампай, пёс.

https://ru.wikipedia.org/wiki/Printf
http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D1%86%D0%B5%D0%BB%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB:_%D0%BF%D1%80%D1%8F%D0%BC%D0%BE%D0%B9_%D0%BA%D0%BE%D0%B4,_%D0%BA%D0%BE%D0%B4_%D1%81%D0%BE_%D1%81%D0%B4%D0%B2%D0%B8%D0%B3%D0%BE%D0%BC,_%D0%B4%D0%BE%D0%BF%D0%BE%D0%BB%D0%BD%D0%B8%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9_%D0%BA%D0%BE%D0%B4
http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B2%D0%B5%D1%89%D0%B5%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB
Читай до просветления.
Аноним 30/09/16 Птн 01:21:30  848512
Я срал тебе в рот, ебал твою маленькую сестру в ее упругую жопу, а потом заставлял слизывать кусочки ее кала с моего твердого, покрытого венами, члена. Ты кусок дерьма, сын пидора и шлюхи, надеюсь, ты сдохнешь от рака прямой кишки. Сучий выблядок и хуесос, сдохни
Аноним 30/09/16 Птн 01:23:52  848514
>>848509
спс что хоть мамку не тронул
Аноним 30/09/16 Птн 01:26:41  848516
>>848494 (OP)
https://github.com/lattera/glibc/blob/master/stdio-common/vfprintf.c сложно посмотреть? Компилятор вообще не в курсе, что ты там передаешь. Это просто undefined behavior.
Аноним 30/09/16 Птн 01:47:20  848520
>>848516
наша училка ебанашка не поверила этому ответу,сказала я все выдумал, тогда я подумал значит есть другое обоснование. ну теперь то я ей в еблет википедию суну, спасибо
Аноним 30/09/16 Птн 04:19:23  848531
>>848520
Это может быть NULL, 0, '\0'
7.21.6.1 [The fprintf function]
http://www.iso-9899.info/n1570.html
9 If a conversion specification is invalid, the behavior is undefined.
Аноним 30/09/16 Птн 13:31:02  848535
732.0 попробуй присвоить
Аноним 30/09/16 Птн 14:11:27  848540
>>848535
инту? совсем ебанутый?
Аноним 30/09/16 Птн 14:22:27  848544
Ебанутых полный тред

Варианты решений
1) float a = 732.0;
или
2) print("%f \n", (float) a);

И идите все нахуй >:3
Аноним 30/09/16 Птн 14:39:55  848547
>>848494 (OP)
>должен брать со стека 4 байта
Он и берёт. Просто не с того стека.
Аноним 30/09/16 Птн 15:35:26  848579
#include <stdio.h>

int main() {
int x = 732;
float y = (float)(&x);
printf("%.50f\n", y);
return 0;
}

Так станет чуть понятнее.
%f просто берет твои биты из инта, интерпретирует их как float и выводит.
Аноним 30/09/16 Птн 15:36:28  848581
Звиздочки проебались, вот пример:
http://pastebin.com/FH0D3bsE
Аноним 30/09/16 Птн 18:50:22  848652
>>848579
>float y = (float)(&x);
почему без этой строчки на выходе не имеем такой же ответ ответ? Вот с этой то строчкой ответ на выходе именно такой, который ожидаю я от компилятора, а почему без нее просто нули?
Аноним 30/09/16 Птн 18:54:45  848655
Кстати, на то что это по сути undefined behavior и так в википедии пишут училка сказала: мало ли что там написано, ты мне биты в клеточках нарисуй и интерпритируй
Аноним 30/09/16 Птн 21:35:25  848709
Короче, покажи училке этот ответ:
http://stackoverflow.com/a/4958507

Суть такова. Т.к. printf это ф-ция с переменным числом аргументов, то она использует va_list и все, что с ним связано.
Внутренняя структура va_list (а именно поля gp_offset и fp_offset) показывает, что параметры целых типов сохраняются в обычных регистрах процессора, а числа с плавающей точкой в регистрах FPU.
Что происходит. Перед самым вызовом printf создается структура va_list и параметры будут распиханы по регистрам. Т.к. мы передали 732, то это число сохранится в обычном регистре. Теперь начинает выполняться printf. Он видит %f и пытается достать из va_list число С ПЛАВАЮЩЕЙ ТОЧКОЙ.
va_list послушно читает значение из регистра FPU, где нихрена нет (просто ноль, т.к. регистр никто не использовал до этого). ВОТ И ВСЕ, РЕБЯТА.
А если училка хочет с битиками поиграться, то пусть через указатели превращает int во float.
Аноним 30/09/16 Птн 22:34:19  848735
>>848709
вот ты красавчик, СПАСИБО, все как я хотел)
Аноним 30/09/16 Птн 22:35:20  848737
>>848709
вот ты красавчик, СПАСИБО, это именно то что я хотел услышать
Аноним 30/09/16 Птн 22:50:52  848750
>>848709
Какие регистры? Ты поехавший. Все в стек пихается. И вот компилятор по стандарту пихает в функции с переменным числом аргументов char/short/int как int, а float/double как double. И никаких блядь регистров.
Аноним 30/09/16 Птн 23:29:33  848767
>>848750
Просвещайся, дурачок:
>> amd64 specifies that up to 6 integer arguments and up to 8 floating-point arguments are passed to functions in registers
https://blog.nelhage.com/2010/10/amd64-and-va_arg/
Подробнее, суть такова:
на современных процах аргументы могут передаваться через регистры. va_arg сохраняет использованные регистры в стек. Но так как мы передали целое оно сохранилось через простой регистр, а printf будет требовать значение из fpu-регистра (а эти регистры хранятся ПО ДРУГОМУ адресу, gp_offset != fp_offset)
Аноним 30/09/16 Птн 23:35:21  848769
>>848767
Так ты сразу бы и говорил, что ты про 64-битные ABI. Там регистры, да.

[Назад][Обновить тред][Вверх][Каталог] [Реквест разбана] [Подписаться на тред] [ ] 24 | 2 | 13
Назад Вверх Каталог Обновить

Топ тредов
Избранное