есть функция
void print_hex(uint32_t v);
есть такие переменные:
double a = 17.;
double b = 18.5;
если print_hex вызвать так
print_hex((a * b * 10.1));
то в результает получим фигню,
если посмотреть на дизассемблер, то видно,
что компилятор, берет выгружает результат умножения 8 байтный регистр сопроцессора,
в два 4 байтных регистра процессора и не заморачиваясь передает первый регистр в качестве
аргумента print_hex
если же print_hex вызвать так:
[ccode]
unsigned int v = (unsigned)(a * b * 10.);
print_hex(v);
[/code]
то выводиться все правильно, в дизасебмлере видно, что компилятор вставляет инструкцию для преобразования
double в int.
Прав ли компилятор в первом случае?
Здравствуйте, <Аноним>, Вы писали:
А>если посмотреть на дизассемблер, то видно,
А>что компилятор, берет выгружает результат умножения 8 байтный регистр сопроцессора,
А>в два 4 байтных регистра процессора и не заморачиваясь передает первый регистр в качестве
А>аргумента print_hex
asm в студию
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
A не С ли это ? Похоже, что идет вызов необъявленной функции и компилятор "автоматически объявляет" int func(double), и кладет в стек параметры соответствующим образом, в то время как принимающая сторона таки ожидает uint.