Софтуерно Инженерство
Loading...
+ Нов въпрос
i12805 avatar i12805 3 Точки

Task 2.5 SerializeMain

Здравейте,

В следния фрагмент от SerializeMain.цпп се извеждат на екрана поредицата байтове, които следва да върне нашата програма:

size_t bytesWritten;
byte* memory = serializeToMemory(input.str(), bytesWritten);
for (byte* b = memory; b < memory + bytesWritten; b++) {
    std::cout << (int)(*b) << " ";
}

Защо, въпреки че масивът е от тип байт, при извеждането се каства на инт?

поздрав!

Тагове:
0
C++ Advanced
Filipbg avatar Filipbg 26 Точки

Не съм си вкъщи за да прегледам SerializeMain.cpp, за да видя целия код. Но за кода който си дал:

std::cout << (int)(*b) << " ";

Това (int) е C style cast. За това се кастват към integers. За C++ 11 е reinterpret_cast

 

https://en.cppreference.com/w/cpp/language/reinterpret_cast

0
10/12/2019 14:25:57
galin_kostadinov avatar galin_kostadinov 163 Точки

Привет!

http://www.cplusplus.com/forum/beginner/121180/

https://en.cppreference.com/w/cpp/types/byte

Кастваш го към int за да вземеш числовата стойност иначе ще ти го принтира като символ.

Искам да допълня още, че има ралика между  (int)(*b) и  (int)(b) - в първия случай си деференцирал даден пойнтър, т.е. взел си стойността към която сочи този пойтър byte *b и след това, тази стойност я кастваш към друг тип в случая int, тъй като byte е по малък и съвместим тип се записва напълно в int, прави се временна променлива  от тип (int)(*b) и се печата на конзолата. Във втория случай говорим за кастване на пойнтър, за което споменава  Filipbg. Тука вече особено този тип кастване  C-Style не се препоръчва.

Всеки пойтър пази адрес, едно число 8byte(или 4byte при 32 битова архитектура), на който започва съответния тип данни(може да са int, char, strint, Person...), но какъв тип са тези данни ти го дава именно типа пойтър дали ще е int *b, char* b, string* b... Това е важно при дереферeнциране на сами пойтър за да ти върне именно стойността на този тип данни, които се пазят на този адрес. Ако чрез неправилно кастване, което си е минало успешно и дереференцираш дадената памет поведението е не дефенирано(от връщане на грешен резултат до прекъсване на програмата поради достъпване на чужда памет, която се намира извън дадената програма).

Поздрави!

1
10/12/2019 16:07:22
i12805 avatar i12805 3 Точки

" Кастваш го към int за да вземеш числовата стойност иначе ще ти го принтира като символ. "

Благодаря.

0
j.petrov_90 avatar j.petrov_90 163 Точки

Привет, колега,

Както са ти отговорили останалите - кастваме го към int за да вземем числовата му стойност.

Ако го оставим от тип "byte" ще се отпечата на конзолата според ASCII кода си. Някой символи обаче(от ASCII таблицата) не са видими.

Поздрави

0