[C++] Dlaczego ten kod nie działa?

0

Witam!

Piszę sobie program, który wysyła dane przez sieć do serwera. Próbuję jakoś umieścić dane z typu short oraz long w buforze, ale coś tu nie działa. Dowiedziałem się w Beej's Guide to Network Programming, że następujący sposób powinien zachować wartość zmienny short w buforze char. Niestety, kiedy uruchomię ten przykładowy program, jako wynik dostaję niespodziewaną wartość 241, zamiast 753.

Oto mój program:

int main(int argc, char *argv[]) {
	unsigned char buf[1024];
	
	unsigned short n=753;
	
	buf[0]=(unsigned char) n >> 8;
	buf[1]=(unsigned char) n;
	
	std::cout << (unsigned short) (buf[0] << 8 | buf[1]) << std::endl;
	
	return 0;
}

Nie ma pojęcia dlaczego to nie działa, przecież ten kod jest prosto z przykładu. Używam Mac OS X 10.5.6 i gcc 4.0.

Proszę o pomoc! :(

0

Operator rzutowania () ma wyższy priorytet niż operator bitowego przesunięcia w prawo >>. W związku z tym liczba 753 najpierw zostaje zrzutowana do char co liczbowo daje 241. Następnie te 241 zostaje poddane operacji przesunięcia co w rezultacie daje 0. Reasumując Twój kod powinien wyglądać tak:

buf[0]=(unsigned char) (n >> 8);

0

to proste - wyświetlasz buf[1] który jest typu char
char możne posiadać wartości od 0 do 255.
jak pod char lądujesz 753 to on takiej liczby nie możne zapisać wiec zapisuje taka jaka możne ( 753-256-256= 241 -nasza magiczna liczba) aby program wyświetlać 753 musisz zmienić typ buf[1024]

0

A nie lepiej w ten sposób ? :

zapis do buforu
*( int, short, whateva *)bufor = wartość;

np. (short)bufor = 2695;

odczyt
int zmienna = (int)bufor;

wystarczy pilnowac offsetow buforu i wszystko samo sie robi bez jakis udziwnień. I jest to najszybsza znana mi metoda. Tak mozesz tez zapisywac cale wlasne agregaty !

Struct typ{
int ...
Char ...
Short ...
Double ...
}

typ zm = (typ)bufor;

tego tamtym sposobem bys latwo nie uzyskal
pozdro

0

Aha, no teraz rozumiem co jest grane. Dzięki! :)

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