Re: GCC slouèení do správného typu

Jaroslav Buchta jaroslav.buchta na hascomp.cz
Čtvrtek Říjen 7 11:50:06 CEST 2021


Takze je to jak jsem si myslel? V GCC to funguje OK, ale obecne nemusi? 
Cili asi lepsi kvuli prenositelnosti na to nespolehat.
ESP urcite nema ARM, to je nejaka Cinska riscova silenost a u ESP32 at 
cumim do assembleru jak chci, nechapu tam nic. Ale z GCC prekladac asi 
vychazi.

Dne 07.10.2021 v 11:32 Jan Waclawek napsal(a):
> Z ciste pravnickeho hladiska...
>
> To finalne pretypovanie na int16_t z nezapornej hodnoty 0..0xFFFF z
> implicitneho int32_t (lebo ten ARM je 32-bitovy - u 16-bitoveho alebo
> 8-bitoveho mcu tam zrejme treba robit saskovanie s explicitnym
> pretypovavanim minimalne na uin16_t) je C99 6.3.1.3. (Conversions->Signed
> and unsigned integers), kde sa pre pripad vysledku vacsieho ako 0x7FFF
> (t.j. hodnoty ktora nie je reprezentovatelna v int16_t) hovori v #3:
> [...] either the result is implementation-defined or an
> implementation-defined signal is raised.
>
> Implementation defined znamena, ze si treba pozriet v manuali k danemu
> prekladacu, ako sa to presne sprava. Pre gcc je to
> https://gcc.gnu.org/onlinedocs/gcc/Integers-implementation.html#Integers-implementation
> :
> For conversion to a type of width N, the value is reduced modulo 2^N to be
> within range of the type; no signal is raised.
>
> co prelozene do ludskej reci znamena, ze sa to zasprava presne ako by sme
> predpokladali.
>
> Left shift znamienkoveho (tu zrejme implicitneho int32_t) je kupodivu v
> tomto pripade v poriadku, 6.5.7#4:
> The result of E1 << E2 [...] . If E1 has a signed
> type and nonnegative value, and E1 × 2^E2 is representable in the result
> type, then that is
> the resulting value; otherwise, the behavior is undefined.
>
> t.j. undefined by to bolo len ak by bol vysledok vacsi ako 0x7FFF'FFFF, co
> tu urcite nebude.
>
>
> Co sa tyka efektivity, napriklad v ARMv7M architekture je instrukcia BFI:
> Bit Field Insert copies any number of low order bits from a register into
> the same number of adjacent bits at any
> position in the destination register.
>
> Neviem co je v tom ESP, tipujem ze ARMv7A, a neviem ci tuto instrukciu ma,
> ale ak ano, mozno to gcc vyuzije.
> Prekladace C su dnes chytre ako opice, nechal by som to na ten prekladac
> aby to vyoptimalizoval.
>
> wek
>
>
> ----- Original Message ---------------
> Kdyz jsou vzdy v nejvyssich bitech ty 0, tak signed/unsigned je jedno,
> ne, stejne se to z-paduje vlevo? Ostatne (cas pro Weka, at mne omlati o
> hlavu C standard), left shift signed si neumim moc predstavit...
> J.
>
> On 07.10.2021 10:17, TomᚠHamouz wrote:
>> Re: GCC slouèení do správného typu Znaménko není tøeba øešit. Pokud je
>> v D15 znaménko a budete to skládat do int16_t, tak bude správnì nastavené.
>> Jen bych dal pozor na to, dìlat bitové posuny jako unsigned a až na
>> konci to pøetypoval na signed.
>>
>> Tomáš
> _______________________________________________
> HW-list mailing list  -  sponsored by www.HW.cz
> Hw-list na list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list




Další informace o konferenci Hw-list