[C++] Rzutowanie według tradycyjnych sposobów

Witam :slight_smile:

Napisałem taki kod, w którym następuje rzutowanie z int na char według starego, tradycyjnego sposobu:

#include 

using namespace std;


int main()

{


int duzy = 0xffff;

char maly;


maly = (char) duzy;


cout << maly;


cout << "\n\n\n\n\n\n\n\n\n\n";

system("pause");

}

W zmiennej maly powinna znaleźć się wartość 0xff (czyli 255), ponieważ nastąpiło “obcięcie” 8 bitów - char jest w stanie pomieścić tylko jeden bajt. Dlaczego, jeśli kompiluje program, w miejscu gdzie powinna wyświetlić się wartość 255 (cout << maly;), nic się nie pojawia :? :?: Jest taka możliwość, że nowe kompilatory ignorują “stare” sposoby rzutowania (mam Microsoft Visual C++ 2008 Express Edition) :?:

Nie wiem czy ma to znaczenie… Ale gdy robię rzutowanie za pomocą nowego sposobu, efekt jest ten sam :confused: ( maly = static_cast(duzy) )

mały jest typu char czyli znak, system wyświetla znak odpowiadający kodowi 255 a to pewnie jakiś znak specjalny który się nie wyświetla.

Chłopie bo ty wyświetlasz znak a nie liczbę 255. Przez cout zmienna typu char jest wyświetlana jako znak.

Jak chcesz wyświetlić char jako liczbę to użyj instrukcji printf().

Zauważ, że nie wyświetlasz liczby, tylko znak. Wyświetla się znak o kodzie 255, czyli coś bliżej niezdefiniowanego. Ja dostaję znak: ‘�’. (pytajnik w rombie)

Spróbuj z cout << “|” << maly << “|” << endl;, powinna być rożnica.

Heh, no też fakt, jak zmienię liczbę 0xffff na inną to wyświetla mi się np. serduszko :stuck_out_tongue:

Nom, to jest fakt… :smiley: Bo gdy inną jakąś liczbę będziesz rzutował, to ci wyjdzie jej odpowiednik w kodzie ASCII np jeśli będziesz rzutował liczbę 100 to wyświetli ci d.

Jedyne co mogę zrobić, co polecić taki ot mały sposób zamiast rzutowania. Tylko wtedy jest problem z liczbami w systemie heksadecymalnym, więc korzystniej jest pisać po prostu normalnie :wink: Oto ten sposób:

#include 

#include 

#include 

using namespace std;


int main()

{


int duzy = 255;

ostringstream ostr;

ostr << duzy;

string maly;

maly = ostr.str();


cout << maly;


cout << "\n\n\n\n\n\n\n\n\n\n";

system("pause");

}

Pozdrawiam

printf("%i",maly);

zamiast

cout << maly;

i mamy liczbę -1

dlaczego?? - a bo typ char jest domyślnie signed (czyli ze znakiem),

a 11111111 w systemie U2 to właśnie -1.

11111111 (bitowo) w systemie bez znaku to byłoby 255.

Problem rozwiązany.

printf("%i",maly); daje wartość -1 ponieważ zmienna maly ma typ char (ze znakiem).

char ma zakres od -128 do +127

unsigned char od 0 do +255

Jeżeli dasz:

unsigned char maly=duzy;

to printf("%i",maly); da 255 tak samo jak cout<<(int)maly;

Ale w którym momencie kodu

unsigned char maly=duzy;

  • podaj konkretne rozwiązanie.

Po pierwsze nie “unsigned maly=duzy;” zaś “unsigned char maly=duzy;” zamiast “char maly=duzy;”.

Po drugie nie rozumiem czego rozwiązanie chcesz uzyskać, nie postawiono konkretnego problemu, jedynie było pytanie czemu tak się dzieje, na to pytanie wg mnie konkretnie odpowiedziałem.