Pretypovani ukazatele struktury na bajt

Jan Waclawek konfera na efton.sk
Úterý Únor 25 17:30:02 CET 2020


[preposielam]

Ahojte,

mna ako amaterskeho programatora jednocipov zaskocila na celej tejto
debate jedna vec a to taka conclusion - otazka:

Vy si pri pisani logickeho algoritmu nepisete na papier typ a ciselne
rozsahy jednotlivych premennych v kazdom kroku programu a po kazdej
operacii?!

Ak by ste to totiz robili, tak hned vidite ake su vysledky a co sa
deje s jednotlivymi premennymi... A kedze dnes velmi vela z Vas
pouziva mikroprocesory s dostatocne velkou RAM, uz aj nove PIC maju
1kB a viac, tak mi ostava zahadou preco nepouzivate dosledne
pretypovavanie premennych do pracovnych alebo pomocnych premennych...
Viem, kompilator to robi za vas... Alebo preco sa neinspirujete v
zdrojakoch z AR alebo roznych tych Zenitov, ktore su volne na webe,
ved pozriet a inspirovat sa ako to robia profesionali nie je predsa
kriminal... Ci ano?!

A.

> Dne 25. 02. 20 v 16:34 David Obdrzalek napsal(a):
> Malinko mi tam lavíruje to, že se shiftem o 8 stalo z 0x00AD (což byl kladný int)
> něco záporného, ale třeba je to jen nedefinované (tj. shift intu tak, že se do intu
> nevejde) a shodou náhod to je takhle. No a to teď ověřil pokus, shift doleva se
> zjevně v mém avr-gcc dělá naprosto jednoduše tak, že se to prostě shiftne bez
> ohledu na znamínko a když zrovna ve výsledku padne jednička do nejvyššího bitu, no
> tak máme záporné číslo :-)
> hdr.ident = (uint32_t)(0xAD << 7) ... 00005680 = 16 nul      a 01010110 10000000
> hdr.ident = (uint32_t)(0xAD << 8) ... FFFFAD00 = 16 jednicek a 10101101 00000000
> hdr.ident = (uint32_t)(0xAD << 9) ... 00005A00 = 16 nul      a 01011010 00000000
> hdr.ident = (uint32_t)(0xAD << 10)... FFFFB400 = 16 jednicek a 10110100 00000000
> hdr.ident = (uint32_t)(0xAD << 11)... 00006800 = 16 nul      a 01101000 00000000
> hdr.ident = (uint32_t)(0xAD << 12)... FFFFD000 = 16 jednicek a 11010000 00000000
> hdr.ident = (uint32_t)(0xAD << 13)... FFFFA000 = 16 jednicek a 10100000 00000000
> hdr.ident = (uint32_t)(0xAD << 14)... 00004000 = 16 nul      a 01000000 00000000



Další informace o konferenci Hw-list