Отговори на тема  [ 17 мнения ]  Отиди на страница Предишна  1, 2
Data types convertions 
Автор Съобщение
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Окт 31, 2004 9:19 pm
Мнения: 4464
Местоположение: Stara Zagora
Мнение 
Това че се каства според променливата го осъзнах.
Но интересно как стои въпроса когато такъв израз е част от друг.
Нещо не намирам в стандарта специфирано как трябва да постъпи компилатора. Или не гледам добре.


Вто Апр 10, 2007 11:36 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Фев 26, 2006 6:52 pm
Мнения: 11266
Местоположение: Добрич
Мнение 
тц.. що карате един хардуерист да ви обяснява софтуер...

Има два подхода, по-простичкият е:
1) гледаш параметрите и решаваш каква ще е типът на операцията. Ако единия от операторите е със знак, значи и операцията ще е със знак, а размерът се определя от по-големия параметър. Примерно ако единия операнд е unsigned char, а другия signed long, то операцията ще е умножение със знак и размер long.
2) Ако единия операнд не съответства на типа на операцията, то може той да се преобразува по тип преди операцията. В горния пример unsigned char параметъра може да се преобразува до положителен long.
3) Типът на резултата се определя от типа на операцията. В общия случай съответстват, но не е задължително. Примерно някои процесори/компилатори могат при умножение на byte да получат int (т.е. без препълване).
4) Като се получи резултата с неговия тип се ползва за последващата операция - независимо дали е присвояване, следващо умножение/деление и т.н. Принципно няма разлика между присвояване и друга математическа операция.
Пак по принцип компилаторите "не мислят". Ако трябва да се направи първо умножение и после присвояване, те щи си направят умножението според типа на операндите и ако се налага след това резултата ще го кастнат според присвояването...
В много редки случаи и при много високи нива на оптимазаци, един достатъчно "умен" компилатор може да се сети, че ако в крайна сметка резултата ще се присвоява на байт а преди това събира long може да изреже long-те преди събирането.

А другият подход е опрерациите да си се разглеждат като overloaded функции - но пак се стига до същите резултати...


Вто Апр 10, 2007 12:50 pm
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 17 мнения ]  Отиди на страница Предишна  1, 2

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 3 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни