<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  </head>
  <body>
    <p>cast na daný typ je asi nejčistější, jak je níže uvedeno. Dále
      matika tj. shift či násobení. Jen ještě endinaita tj. pořadí bytů
      bude dělat čáry. Obecně se nevyhnete těmto specialitám. Proto se
      většinou zdrojáky na hw závislosti dávají mimo logiku.</p>
    <p>Jirka<br>
    </p>
    <div class="moz-cite-prefix">Dne 07.10.2021 v 10:45 Jaroslav Buchta
      napsal(a):<br>
    </div>
    <blockquote type="cite"
      cite="mid:0c7d039e-5bc7-b1e6-7545-2682d1c93bd9@hascomp.cz">
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
      <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" moz-do-not-send="true">www.HW.cz</a>
<a class="moz-txt-link-abbreviated" href="mailto:Hw-list@list.hw.cz" moz-do-not-send="true">Hw-list@list.hw.cz</a>
<a class="moz-txt-link-freetext" href="http://list.hw.cz/mailman/listinfo/hw-list" moz-do-not-send="true">http://list.hw.cz/mailman/listinfo/hw-list</a>
</pre>
      </blockquote>
      <p><br>
      </p>
      <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>
  </body>
</html>