2015-05-16 8 views
6

Szybkie pytanie: Ponieważ int to 2 bajty, a char to 1 bajt, chcę zapisać zmienną typu int w 2 zmiennych znakowych. (jak bit 1 - 8 do pierwszego znaku, bit 9-16 do drugiego znaku). Używanie C jako języka programowania.Store int in 2 chars

Jak mogę to osiągnąć? Czy coś takiego:

int i = 30543; 
char c1 = (char) i; 
char c2 = (char) (i>>8); 

wykonać zadanie?

Nie mogłem znaleźć, czy rzucanie int do char po prostu upuszcza bity 9-16.

+6

Nie można zagwarantować, że 'int' jest dwa bajty, można jednak skorzystać z' 'stdint.h' int16_t' która jest gwarantowana być szeroki 2 bajty . To ciekawe pytanie, ale nie sądzę, że można znaleźć odpowiedź specyficzną dla 'char', ale jeśli się nad tym zastanowić, nie będzie sposobu na przechowywanie więcej niż' CHAR_BIT' bitów w 'char', stąd obsada nie jest potrzebne. –

+3

"int to dwa bajty" rodzi pytanie, jakiego kompilatora używasz? Int jest najczęściej 32-bitowym, czyli 4-bajtowym, w tych dniach, zarówno w środowiskach 32-, jak i 64-bitowych. – hyde

+0

Nie jestem pewien, czy jest to bankomat, ponieważ jest zainstalowany na komputerach uniwersyteckich, ale moi koledzy mówili mi, że to dwa bajty. Równie dobrze można użyć int16_t, aby być w 100% pewni, dzięki! –

Odpowiedz

4

Wyekstrahowano z projektu c11 n1570

6.5.4 operatorzy odlewanie

  1. Jeżeli wartość wyrażenia jest reprezentowana przez większy zakres lub precyzja niż jest wymagana według typu określonego przez rzutowanie (6.3.1.8), a następnie rzut określa konwersję, nawet jeśli typ wyrażenia jest taki sam jak podany typ i usuwa wszelkie dodatkowe zakresy i dokładność .

więc obsada będzie rzeczywiście usunąć dodatkowe bity, ale to i tak nie jest potrzebne, ponieważ wartość będzie niejawnie konwertowane do char, a powyżej miałyby zastosowanie w każdym razie.

+0

To wszystko, czego potrzebowałem, więc powyższe powinno zadziałać. Dzięki! –

0

Po prostu trzeba zrobić:

char c1 = (char) ((i << 8) >> 8); 

char c2 = (char) (i >> 8);