a
on osoitin tavujärjestelmälle. Jos heität sen uint16_t-tiedostoon ja määrität sen kohtaan b
, b
sisältää taulukon (johon se on tallennettu) pohjan osoitteen SRAM: ssä. Jos haluat käsitellä taulukon a
kahta tavua kokonaislukuna, käytä sitten käyttäjän14284 ehdottamaa liittoa, mutta muista, että unioni edustaa tavujärjestystä muistin tavujärjestyksessä arkkitehtuuri (AVR: ssä se olisi vähän endiaa, mikä tarkoittaa, että tavu 0 on vähiten merkitsevä tavu). Tapa kirjoittaa koodi koodiin on:
union {uint8_t a [2]; uint16_t b;} x; xb [0] = 0x35; xb [1] = 0x4A; // kahden edellisen tehtävän perusteellax.a == 0x4A35 // on totta
Toinen tapa tehdä tämä ilman unionia on heittää a
uint16_t-osoittimeen ja tehdä siitä poikkeama näin:
uint8_t a [2] = {0x35, 0x4A }; uint16_t b = * ((uint16_t *) a); b == 0x4A35; // koska AVR on vähän endian
Jos käytät puskuria isojen endiantietojen (esim. verkon tavujärjestys) tallentamiseen, sinun on vaihdettava tavu vaihtamalla kumpaakin näistä tekniikat. Tapa tehdä se ilman haaroja tai väliaikaisia muuttujia on:
uint8_t a [2] = {0x35, 0x4A}; a [0] ^ = a [1]; a [1] ^ = a [0]; a [0] ^ = a [1]; a [0] == 0x4A; // truea [1] == 0x35; // true
Muuten tämä ei ole AVR tai edes upotettu ongelma. PC-tietokoneille kirjoitettu sovellustason verkkokoodi kutsuu yleensä toimintoja nimeltä htonl
, htons
(isäntä verkkoon, 32- ja 16-bittiset variantit) ja ntohl
, ntohs
(verkko isäntään, 32- ja 16-bittiset variantit), joiden toteutukset ovat kohdearkkitehtuurista riippuvaisia siitä, vaihtavatko ne tavut vai eivät (olettaen, että tavut lähetetään "langalla") ovat aina suurikokoisia, kun ne ovat osa monitavuisia sanoja).