Typ danych między int a short, int24?

0

Hej,
Potrzebny mi jest typ danych na liczby całkowite, bez znaku, do zapisania na 3 bajtach, czyli 24 bitach.
Muszę móc na nim zapisać wartość, odczytać wartość i dodać 1.
Czy jest jakaś prosta metoda na stworzenie czegoś takiego?

1

Korzystaj z int (zakładając, że ma co najmniej 3 bajty) i obcinaj zbędne bity.

0

Ze co brakuje pamięci przy normalnych int'ach ?

0

A jak to zrobić? Czy int po takiej operacji będzie realnie w pamięci zajmował 3 bajty?
Tak, mam zapisać liczbę np 16 003 789 mieszcząc się na 3 bajtach realnie zajmowanej pamięci, takie zadanie "optymalizacyjne".

0

Wydaje mi się, że pola bitowe (http://pl.wikipedia.org/wiki/Pole_bitowe) powinny rozwiązać twój problem, choć nie jestem pewny w 100%.
Przykładowe rozwiązanie:


int main(int argc, char **argv)
{
  struct {
    unsigned int value:24;
  } your_variable;

  return 0;
}
1
kamilwxx napisał(a):
int main(int argc, char **argv)
{
  struct {
    unsigned int value:24;
  } your_variable;

  return 0;
}

Pudło - http://ideone.com/tVY1Nk

0

Ok, czyli wygląda na to że będzie trzeba kombinować z przesunięciami na tablicy char'ów.

1
class int24
  {
   unsigned char tb[3];
   public:
   explicit int24(unsigned value) { memcpy(tb,&value,3); }
   operator unsigned()const { unsigned value=0; memcpy(&value,tb,3); return value; }
   int24 &operator++() { unsigned value=0; memcpy(&value,tb,3); ++value; memcpy(tb,&value,3); return *this; }
  };

Uwaga tylko dla Little Endian

0

Jakie to oszczędzanie pamięci, skoro narzucasz dodatkowe kilkadziesiąt~kilkaset bajtów związanych z alokacją obiektu per każdy taki uint24_t?

0

możesz sobie zrobić strukturę trzech bajtów i skorzystać z unii żeby łatwo modyfikować wartości bez żadnych przesunięć bitowych

http://ideone.com/vEZ3sE

1
Patryk27 napisał(a):
kamilwxx napisał(a):
int main(int argc, char **argv)
{
  struct {
    unsigned int value:24;
  } your_variable;

  return 0;
}

Pudło - http://ideone.com/tVY1Nk

Mówisz http://ideone.com/XPAmb2

0

Cudo, mogę to zapisać jako jakiś typ czy każdy obiekt musiałbym podobnie tworzyć?

0

Możesz to połączyć z tym co ja podałem, w wyniku otrzymasz znacznie zgrabniejszy kod, tylko że __attribute__ ((__packed__)) nie jest częścią standardu więc pod jednym kompilatorem zadziała pod drugim nie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1