double -> int
От: Аноним  
Дата: 28.12.09 13:51
Оценка:
есть функция
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.

Прав ли компилятор в первом случае?
Re: double -> int
От: CreatorCray  
Дата: 28.12.09 13:52
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>если посмотреть на дизассемблер, то видно,

А>что компилятор, берет выгружает результат умножения 8 байтный регистр сопроцессора,
А>в два 4 байтных регистра процессора и не заморачиваясь передает первый регистр в качестве
А>аргумента print_hex
asm в студию
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Re: double -> int
От: Сергей Мухин Россия  
Дата: 28.12.09 14:06
Оценка:
Здравствуйте, Аноним, Вы писали:


А>Прав ли компилятор в первом случае?


— язык
— компилятор и его версия
— объявлена ли ф-ия перед использованием?
---
С уважением,
Сергей Мухин
Re: double -> int
От: serg_joker Украина  
Дата: 06.01.10 15:03
Оценка:
A не С ли это ? Похоже, что идет вызов необъявленной функции и компилятор "автоматически объявляет" int func(double), и кладет в стек параметры соответствующим образом, в то время как принимающая сторона таки ожидает uint.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.