Hlavní navigace

Názor ke článku Počítání s přetečením v C od Karel - [24] To trochu zavání "na mám počítači to...

  • 3. 10. 2014 9:56

    Karel (neregistrovaný)

    [24] To trochu zavání "na mám počítači to funguje". Jinak historicky se tyhle věci implementovaly právě pomocí nižšího počtu bitů. V tomhle případě bych použil 32bitový int, ale počítal se 16 bity. Pro jeden blok (16 bitů) to pak je:
    X = (A + B + carry_in) & 0x0ffff
    carry_out = (A + B + carry_in) >> 16 /* shift right, nebo taky AND, záleží zda to použiji v "if" nebo pro aritmetiku */

    Pro rozhodnutí, jak velké bloky použít (4, 8, 15, 16, 31 bitů apod.), je důležité vědět, jak máte ta data uložena v paměti. Použití 16 bitů na procesoru co umí 32 (nebo 8 na procesoru co umí 16) je výhodné obvykle proto, že data jsou uložena v paměti jako sled bytů, takže lze pro čtení a zápis použít klasické ukazatele a offsety (pozor na little/big endian). Opticky to vypadá strašidelně, ale procesory to zvládají rychle, protože je to jen sčítání, AND a rotace, navíc hezky proložené čtením a zápisem do paměti, bez skoků. Tedy pokud se nebavíme o funkci _addc_ ale o funkci add_64bit(byte *A, byte *B, carry_in, byte *X, carry_out).