<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<div class="moz-cite-prefix">No ja bych rad videl jasnou definici
pravidla, ze to takhle je OK, to jsem zatim nikde nenasel. Tim
padem nemam nejak jistotu, ze to kazdy prekladac udela dle
ocekavani a zmeni jenom typ. Taky by se mohl snazit prizpusobit
hodnotu, coz v pripade cisla 32768+ do int16 nejde nacpat... Ale
mozna to definovano jasne je, cekam, ze to sem nekdo da a ja to
zacnu v klidu pouzivat ;-)<br>
</div>
<div class="moz-cite-prefix">Dne 07.10.2021 v 10:37 Tomáš Hamouz
napsal(a):<br>
</div>
<blockquote type="cite"
cite="mid:726390278.20211007103705@seznam.cz">
<title>Re: GCC sloučení do správného typu</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<span style=" font-family:'Courier New'; font-size: 10pt;">Je.
Dáváte tím překladači najevo že chcete "u" interpretovat jako
signed. Může vyhodit warning, že může dojít ke ztrátě dat, ale
to je očekávané chování.<br>
Ještě bych k tomu skládání přidal masky na jednotlivé bity. Sice
to trochu bude zdržovcat, ale máte jistotu že se nikde
nepřiplete nastavený bit který nechcete.<br>
<br>
Tedy <br>
uint16_t temp = (((uint16_t)precteno[0] & 0x03U) <<
14)<br>
| (((uint16_t)precteno[1] & 0x7FU) <<
7)<br>
| ((uint16_t)precteno[2] & 0x7FU));<br>
int16_t result = (int16_t)temp; <br>
<br>
<br>
Tomáš<br>
<br>
<br>
<br>
</span>
<table>
<tbody>
<tr>
<td width="3" bgcolor="#0000ff"><br>
</td>
<td><span style=" font-family:'courier new'; font-size:
10pt;">No a je spravne napsat napr.:<br>
uint16_t u = 65535;<br>
int16_t i = (int16_t)u;<br>
?<br>
Vim, ze v C to asi funguje ale v C# to nesezere, takze
si k tomu davam automaticky !, protoze to je asi v
principu nebezpecna konstrukce.<br>
A bitove posuvy v signed muzou taky asi dopadnout ruzne
podle platformy a prekladace, ale taky si nejsem jisty.<br>
<br>
Dne 07.10.2021 v 10:17 Tomáš Hamouz napsal(a):<br>
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é.<br>
Jen bych dal pozor na to, dělat bitové posuny jako
unsigned a až na konci to přetypoval na signed.<br>
<br>
Tomáš<br>
<br>
<br>
<span style=" color: #800000;"><b>> No a ted to
znamenko,<br>
> int16_t i = (int16_t)res;<br>
> Myslim, ze to funguje ale je mi to nejak proti
srsti, je to korektni <br>
> obecne takto napsat?<br>
> Prasarny typu konverze pres ukazatele... nevim.<br>
> Nejcistsi mi prijde:<br>
> int16_t i = (res & 0x8000) ?
(int16_t)((int32_t) res - 65536) : <br>
> (int16_t)res;<br>
> snad jsem se neseknul, prekladac si s tim pri
pohledu do ASM poradi <br>
> vetsinou se cti.<br>
<br>
> Dne 07.10.2021 v 9:24 Jindroush napsal(a):<br>
>> On 07.10.2021 9:03, Jindrich Fucik wrote:<br>
>>> mám tu jednu takovou spíš akademickou
otázku. Nejprve popíšu <br>
>>> prostředí. Hardware je ESP8266,
programovaný v Arduino IDE, takže <br>
>>> překladač je GCC.<br>
<br>
>>> ESP je připojeno sériovou linkou do
zařízení, které komunikuje <br>
>>> sedmibitově. zařízení je založeno na
8bit intel platformě, data jsou <br>
>>> tedy integery 16 bit (znaménkové). Při
posílání se nejprve posílá <br>
>>> MSB, první dva bity, pak prostředních 7
a pak posledních 7 LSB. Data <br>
>>> přečtu jako pole "byte" (což je jen
alias k unsigned char). Pokud se <br>
>>> pokusím to rozepsat po bitech tak je to
takto:<br>
<br>
>>> precteno byte[3]<br>
>>> |0 0 0 0 0 0 D15 D14| |0 D13 D12 D11
D10 D9 D8 D7| |0 D6 D5 D4 D3 <br>
>>> D2 D1 D0|<br>
<br>
>>> A teď otázka - jak nejefektivněji na
tom ESP poskládat zpátky int, <br>
>>> který zachová znaménko? <br>
<br>
>> pokud mate int16_t na tom esp, tak asi
nejak jako, pokud je zajisteno, <br>
>> ze to, co jste vyse napsal jako '0' je vzdy
0.<br>
>> int16_t res = ( precteno[0] << 14 )
|| ( precteno[1]) << 7 ) || <br>
>> precteno[2];<br>
>> Netusim samozrejme, jak drahy je na takovem
procesoru shift a v jak <br>
>> 'dlouhe' smycce to je.<br>
<br>
<br>
> _______________________________________________<br>
> HW-list mailing list - sponsored by </b></span></span><a
style=" font-family:'courier new'; font-size: 10pt;"
href="http://www.HW.cz" moz-do-not-send="true">www.HW.cz</a><br>
<a style=" font-family:'courier new'; font-size: 10pt;"
href="mailto:Hw-list@list.hw.cz" moz-do-not-send="true">>
Hw-list@list.hw.cz</a><br>
<a style=" font-family:'courier new'; font-size: 10pt;"
href="http://list.hw.cz/mailman/listinfo/hw-list"
moz-do-not-send="true">>
http://list.hw.cz/mailman/listinfo/hw-list</a> <br>
<span style=" font-family:'courier new'; font-size: 10pt;">_______________________________________________<br>
HW-list mailing list - sponsored by </span><a style="
font-family:'courier new'; font-size: 10pt;"
href="http://www.HW.cz" moz-do-not-send="true">www.HW.cz</a><br>
<a style=" font-family:'courier new'; font-size: 10pt;"
href="mailto:Hw-list@list.hw.cz" moz-do-not-send="true">Hw-list@list.hw.cz</a><br>
<a style=" font-family:'courier new'; font-size: 10pt;"
href="http://list.hw.cz/mailman/listinfo/hw-list"
moz-do-not-send="true">http://list.hw.cz/mailman/listinfo/hw-list</a><br>
</td>
</tr>
</tbody>
</table>
<span style=" font-family:'courier new'; font-size: 10pt;">No a je
spravne napsat napr.:<br>
uint16_t u = 65535;<br>
int16_t i = (int16_t)u;<br>
?<br>
Vim, ze v C to asi funguje ale v C# to nesezere, takze si k tomu
davam automaticky !, protoze to je asi v principu nebezpecna
konstrukce.<br>
A bitove posuvy v signed muzou taky asi dopadnout ruzne podle
platformy a prekladace, ale taky si nejsem jisty.<br>
<br>
Dne 07.10.2021 v 10:17 Tomáš Hamouz napsal(a):<br>
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é.<br>
Jen bych dal pozor na to, dělat bitové posuny jako unsigned a až
na konci to přetypoval na signed.<br>
<br>
Tomáš<br>
<br>
<br>
<span style=" color: #800000;"><b>> No a ted to znamenko,<br>
> int16_t i = (int16_t)res;<br>
> Myslim, ze to funguje ale je mi to nejak proti srsti,
je to korektni <br>
> obecne takto napsat?<br>
> Prasarny typu konverze pres ukazatele... nevim.<br>
> Nejcistsi mi prijde:<br>
> int16_t i = (res & 0x8000) ? (int16_t)((int32_t)
res - 65536) : <br>
> (int16_t)res;<br>
> snad jsem se neseknul, prekladac si s tim pri pohledu
do ASM poradi <br>
> vetsinou se cti.<br>
<br>
> Dne 07.10.2021 v 9:24 Jindroush napsal(a):<br>
>> On 07.10.2021 9:03, Jindrich Fucik wrote:<br>
>>> mám tu jednu takovou spíš akademickou otázku.
Nejprve popíšu <br>
>>> prostředí. Hardware je ESP8266, programovaný v
Arduino IDE, takže <br>
>>> překladač je GCC.<br>
<br>
>>> ESP je připojeno sériovou linkou do zařízení,
které komunikuje <br>
>>> sedmibitově. zařízení je založeno na 8bit intel
platformě, data jsou <br>
>>> tedy integery 16 bit (znaménkové). Při posílání
se nejprve posílá <br>
>>> MSB, první dva bity, pak prostředních 7 a pak
posledních 7 LSB. Data <br>
>>> přečtu jako pole "byte" (což je jen alias k
unsigned char). Pokud se <br>
>>> pokusím to rozepsat po bitech tak je to takto:<br>
<br>
>>> precteno byte[3]<br>
>>> |0 0 0 0 0 0 D15 D14| |0 D13 D12 D11 D10 D9
D8 D7| |0 D6 D5 D4 D3 <br>
>>> D2 D1 D0|<br>
<br>
>>> A teď otázka - jak nejefektivněji na tom ESP
poskládat zpátky int, <br>
>>> který zachová znaménko? <br>
<br>
>> pokud mate int16_t na tom esp, tak asi nejak jako,
pokud je zajisteno, <br>
>> ze to, co jste vyse napsal jako '0' je vzdy 0.<br>
>> int16_t res = ( precteno[0] << 14 ) || (
precteno[1]) << 7 ) || <br>
>> precteno[2];<br>
>> Netusim samozrejme, jak drahy je na takovem
procesoru shift a v jak <br>
>> 'dlouhe' smycce to je.<br>
<br>
<br>
> _______________________________________________<br>
> HW-list mailing list - sponsored by </b></span></span><a
style=" font-family:'courier new'; font-size: 10pt;"
href="http://www.HW.cz" moz-do-not-send="true">www.HW.cz</a><br>
<a style=" font-family:'courier new'; font-size: 10pt;"
href="mailto:Hw-list@list.hw.cz" moz-do-not-send="true">>
Hw-list@list.hw.cz</a><br>
<a style=" font-family:'courier new'; font-size: 10pt;"
href="http://list.hw.cz/mailman/listinfo/hw-list"
moz-do-not-send="true">>
http://list.hw.cz/mailman/listinfo/hw-list</a> <br>
<span style=" font-family:'courier new'; font-size: 10pt;">_______________________________________________<br>
HW-list mailing list - sponsored by </span><a style="
font-family:'courier new'; font-size: 10pt;"
href="http://www.HW.cz" moz-do-not-send="true">www.HW.cz</a><br>
<a style=" font-family:'courier new'; font-size: 10pt;"
href="mailto:Hw-list@list.hw.cz" moz-do-not-send="true">Hw-list@list.hw.cz</a><br>
<a style=" font-family:'courier new'; font-size: 10pt;"
href="http://list.hw.cz/mailman/listinfo/hw-list"
moz-do-not-send="true">http://list.hw.cz/mailman/listinfo/hw-list</a><br>
<br>
<fieldset class="mimeAttachmentHeader"></fieldset>
<pre class="moz-quote-pre" wrap="">_______________________________________________
HW-list mailing list - sponsored by <a class="moz-txt-link-abbreviated" href="http://www.HW.cz">www.HW.cz</a>
<a class="moz-txt-link-abbreviated" href="mailto:Hw-list@list.hw.cz">Hw-list@list.hw.cz</a>
<a class="moz-txt-link-freetext" href="http://list.hw.cz/mailman/listinfo/hw-list">http://list.hw.cz/mailman/listinfo/hw-list</a>
</pre>
</blockquote>
<p><br>
</p>
</body>
</html>