Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > проблемма с int64 в d7


Автор: Чучмек 5.5.2012, 20:47
Неделю бился с разбегу головой об столб.
Как оказалось,на следующем коде:
Код

var
 r:int64;
a,b,c:cardinal;
...
r:=a*(b-2)+c;

Произведение дает правильный результат только, если хотя бы один из множителей int64

Автор: XperT 6.5.2012, 01:25
Так и должно быть: операции (умножения, деления и т.д.) происходят не одновременно над всеми переменными, а в конкретный момент времени над двумя, операция у которых имеет больший приоритет. Именно в момент проведения операции 2 переменных, если они разного типа, приводятся к одному (не знаю как это правильно объяснить, но получается что результующий тип будет определен по той переменной, размер типа которой больше). А так как операция присвоения имеет самый низкий приоритет, то приведения к типу int64 происходит в последнюю очередь.

В общем должен решить проблему следующий код:
Код

r := int64(a) * (b-2) + c;


P.S. Если плохо объясняю, то сразу прошу прощения, лектор из меня никудышний

Автор: Чучмек 6.5.2012, 12:21
Цитата(XperT @  6.5.2012,  01:25 Найти цитируемый пост)
Именно в момент проведения операции 2 переменных, если они разного типа, приводятся к одному (не знаю как это правильно объяснить, но получается что результующий тип будет определен по той переменной, размер типа которой больше)

Нет, приводится к 32битам, иначе cardinal:=byte*byte - даст максимум 255.
Просто ожидал, что  компилятор учитывает тип переменной в которую сохраняется результат.
 
Цитата(XperT @  6.5.2012,  01:25 Найти цитируемый пост)
r := int64(a) * (b-2) + c;

Да, так и сделал.

Автор: XperT 6.5.2012, 13:07
Цитата(Чучмек @ 6.5.2012,  12:21)
Нет, приводится к 32битам, иначе cardinal:=byte*byte - даст максимум 255.
Просто ожидал, что  компилятор учитывает тип переменной в которую сохраняется результат.

Да, я ошибся, то что я описал имеет место в Visual Studio. В Делфи компилятор действительно учитывает тип переменной в которую будет записан результат, иначе такая операция давала бы целочисельный результат: double := integer / integer.

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)