OT Ceckarsky kviz

Miroslav Šinko sinkomiro@gmail.com
Čtvrtek Březen 5 16:45:13 CET 2009


Musim sa trochu opravit v tom, ze som pisal, ze operandy bitoveho
posunu sa konvertuju na int. Ono to plati, ale nie vzdy. Na 8-bit
systeme by ste nemali moznost posuvat vacsie, ako 8 bitove premenne
:-) V norme je to takto:

If an int can represent all values of the original type, the value is
converted to an int;
otherwise, it is converted to an unsigned int. These are called the integer
promotions.48) All other types are unchanged by the integer promotions.

T.j. na 8-bitovom systeme (int ma 8 bitov) ked si pretypujete vysledky
funkcii bGetVal napr. na WORD, tak kompilator pre bitovy posun necha
WORDy, neskonvertuje ich naspat na 8-bit int :-) V systemoch, kde int
je vacsi ako 8 bitov sa konverzia udeje.

miro


2009/3/5 Miroslav Šinko <sinkomiro@gmail.com>:
> S tymto istym tvrdenim som sa uz stretol, ale podla normy pravdive nie
> je. Nasiel som kapitolu "Usual arithmetic conversions", ktora
> pojednava o konverziach operandov vyrazov. Nejdem to tu cele
> kopirovat, pre celociselne typy je tych pravidiel viac, pre Vasu
> otazku je podstatne toto:
>
> If both operands have the same type, then no further conversion is needed.
>
> Otherwise, if both operands have signed integer types or both have unsigned
> integer types, the operand with the type of lesser integer conversion rank is
> converted to the type of the operand with greater rank.
> (kde ranky su definovane vyssie v zmysle long int > int > short >...)
>
> Z toho mne vyplyva, ze nezalezi na poradi, ten "mensi" sa vzdy
> skonvertuje na "vacsi".
>
> Dalej treba pozerat aj na jednotlive operatory. Napr. bitovy OR ma
> uvedene, ze pouziva iba "Usual arithmetic conversions", ale bitovy
> posun << ma uvedene, ze oba operandy su konvertovane na int a aj
> vysledok bude int.
>
> Preto to v pripade GetVal() | GetVal<<8 na MSVC (32-bit) aj GCC
> (pocitam, ze min 16-bit) fungovalo.
> 1. Vyhodnotili sa vyrazy pre OR:
> a) GetVal() - volanie funkcie, vysledok BYTE
> b) GetVal()<<8 - volanie funkcie, vysledok BYTE; konverzia vysledku na
> int kvoli <<; konverzia 8 na int; vysledok posunu v int
> 2. Pred operaciou | sa prvy vyraz v sulade s "Usual.." skonvertoval na int
> 3. Konecny vysledok je int; orezal sa na WORD (mimochodom na toto mi
> MSVC hodil warning, ze mozem prist o data)
>
> miro
>
>
> 2009/3/5 Petr Tošovský <PetrTosHW@ptmodel.cz>:
>> Nemuzu se do takovych hloubkovych debat zapojovat coby programator
>> samorost a navic jen stylem pokus-omyl do soucasne doby, ale mam
>> zapamatovano, ze typ celeho vyrazu se (nevim jestli ve vsech
>> kompilatorech) urcuje podle prvniho clenu. Tudiz by to pretypovani
>> nebylo jen jistota u posunu, ale nutnost pred prvnim clenem vyrazu
>> (vysledek funkce GetByte je 8 bitovy), aby bylo kam vubec ORem pricist
>> horni byte?
>> Coz by tedy platilo v tomto pripade pro 8 bitove architektury. Je to
>> skutecne tak nebo to timhle zpusobem delam zbytecne? Predem diky za
>> vysvetleni.
>> Jinak krasny priklad a rozbor vyhodnoceni a volani funkci, pekna ukazka.
>>
>> Tosa
>



Další informace o konferenci Hw-list