почему на выходе имеем нули вместо 732.00000???мне всего то нужно понять как работает этот код, я не ставлю цель вывести переменную правильно, мне не нужны преобразования типов и проч. я хочу разобраться что происходит в принтэфе, как он выводит эту переменную, по сути он что %f, что %d должен брать со стека 4 байта но интерпритировать их по разному(тобишь целое или плавающее) но происходит то что я понять не могу
бамп
я ебал твою мать
>>848504>>848505>>848506Анус себе бампай, пёс.https://ru.wikipedia.org/wiki/Printfhttp://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%B4http://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Читай до просветления.
Я срал тебе в рот, ебал твою маленькую сестру в ее упругую жопу, а потом заставлял слизывать кусочки ее кала с моего твердого, покрытого венами, члена. Ты кусок дерьма, сын пидора и шлюхи, надеюсь, ты сдохнешь от рака прямой кишки. Сучий выблядок и хуесос, сдохни
>>848509спс что хоть мамку не тронул
>>848494 (OP)https://github.com/lattera/glibc/blob/master/stdio-common/vfprintf.c сложно посмотреть? Компилятор вообще не в курсе, что ты там передаешь. Это просто undefined behavior.
>>848516наша училка ебанашка не поверила этому ответу,сказала я все выдумал, тогда я подумал значит есть другое обоснование. ну теперь то я ей в еблет википедию суну, спасибо
>>848520Это может быть NULL, 0, '\0'7.21.6.1 [The fprintf function]http://www.iso-9899.info/n1570.html9 If a conversion specification is invalid, the behavior is undefined.
732.0 попробуй присвоить
>>848535инту? совсем ебанутый?
Ебанутых полный тредВарианты решений1) float a = 732.0;или2) print("%f \n", (float) a);И идите все нахуй >:3
>>848494 (OP)>должен брать со стека 4 байтаОн и берёт. Просто не с того стека.
#include <stdio.h>int main() { int x = 732; float y = (float)(&x); printf("%.50f\n", y); return 0;}Так станет чуть понятнее.%f просто берет твои биты из инта, интерпретирует их как float и выводит.
Звиздочки проебались, вот пример:http://pastebin.com/FH0D3bsE
>>848579>float y = (float)(&x);почему без этой строчки на выходе не имеем такой же ответ ответ? Вот с этой то строчкой ответ на выходе именно такой, который ожидаю я от компилятора, а почему без нее просто нули?
Кстати, на то что это по сути undefined behavior и так в википедии пишут училка сказала: мало ли что там написано, ты мне биты в клеточках нарисуй и интерпритируй
Короче, покажи училке этот ответ: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.
>>848709вот ты красавчик, СПАСИБО, все как я хотел)
>>848709вот ты красавчик, СПАСИБО, это именно то что я хотел услышать
>>848709Какие регистры? Ты поехавший. Все в стек пихается. И вот компилятор по стандарту пихает в функции с переменным числом аргументов char/short/int как int, а float/double как double. И никаких блядь регистров.
>>848750Просвещайся, дурачок:>> amd64 specifies that up to 6 integer arguments and up to 8 floating-point arguments are passed to functions in registershttps://blog.nelhage.com/2010/10/amd64-and-va_arg/Подробнее, суть такова:на современных процах аргументы могут передаваться через регистры. va_arg сохраняет использованные регистры в стек. Но так как мы передали целое оно сохранилось через простой регистр, а printf будет требовать значение из fpu-регистра (а эти регистры хранятся ПО ДРУГОМУ адресу, gp_offset != fp_offset)
>>848767Так ты сразу бы и говорил, что ты про 64-битные ABI. Там регистры, да.