Re: pøeteèení int v C arduino

Jan Waclawek konfera na efton.sk
Pátek Červenec 18 18:29:47 CEST 2014


> > Ta konstanta 12345 ma v avr-gcc implicitny typ int16_t (ak by bola vacsia ako 
>32767, tak bude mat implicitny typ int32_t
>Mohl bych poprosit o odkaz, kde je to uvedeno? Zajimaly by me i dalsi varianty.

OK.

Najprv sirka int, ta je podla normy implementacne zavisla C99 5.2.4.2,
implementacia (gcc) sa v dokumentacii
https://gcc.gnu.org/onlinedocs/gcc/C-Implementation.html ->
https://gcc.gnu.org/onlinedocs/gcc/Architecture-implementation.html#Architecture-implementation
odkazuje na ABI, ktore je pre target AVR popisany v
https://gcc.gnu.org/wiki/avr-gcc , kde najdeme v tabulke Type Layout ze
sizeof(int) = 2, t.j. int je 16-bit siroke. Nie je to tam sice explicitne
napisane, ale asi mi uverite, ze format int je 2's complement ;-) Takze je
to ekvivalent int16_t (ktory je definovany v C99 7.18.1.1).

Teraz implicitne typy konstant, C99 6.4.4.1, 12345 je decimal pretoze
nezacina nulou ani nema v sebe desatinnu bodku, takze pozerame do prveho
stlpca tabulky; kedze nema suffix, pozerame do prveho riadku tabulky,
ideme zhora, 12345 sa zmesti do hned prveho typu co je int, co je (ako sme
hore uviedli) int16_t.




>> ten medzivysledok mohol byt zaporny, takze napr. kebyze je -12345, co je 
>> 0xCFC7, tak po konverzii na uint32_t je to stale 0x0000CFC7
>Toto konverzni pravidlo je implementacne zavisle, nebo je to tez nekde definovano?

Cela kapitola 6.3 je venovana konverziam. Je to nechutna zalezitost. 

(Ako Derek Jones pise, riesenia pre spracovanie vyrazov su vo vseobecnosti
dve: bud nedovolit vyrazy so zmiesanymi typmi (takych jazykov co to
nedovolia je asi minimum); alebo robit implicitne konverzie, a na to druhe
sa da hladiet bud ako dobra vec pre pohodlie uzivatela alebo ako zla vec
kvoli zlozitosti a potencialnym chybam...)

Aby som bol konkretny, tento pripad je pokryty 6.3.1.3#2 (t.j. konverzia
medzi celociselnymi typmi, ked novy typ nedokaze reprezentovat povodnu
hodnotu (a tu nedokaze, lebo mame zapornu hodnotu a uint32_t dokaze
reprezentovat len kladne hodnoty), a novy typ je unsigned); a aj ked to
znie zmatene, dava to zmysel:

Otherwise, if the new type is unsigned, the value is converted by
repeatedly adding or
subtracting one more than the maximum value that can be represented in the
new type
until the value is in the range of the new type.49)

49) The rules describe arithmetic on the mathematical value, not the value
of a given type of expression.

Ten footnote treba chapat tak, ze ta konverzia je robena matematicky, s
nekonecnou sirkou. Jedna sa o zidealizovanu konverziu, ale prekladac sa
podla toho musi spravat.

Ako vravim, znie to zmatene, ale vo vsetkych beznych pripadoch (2's
complement binary) to jednoducho znamena, ze sa bud odseknu vyssie bity
alebo sa pridaju nulove vyssie bity.



Staci takto?


wek



Další informace o konferenci Hw-list