Polskie znaki - dlaczego polskie litery maja tak dużą wartośc liczbową

0

Witam,

Uczę się dopiero programować, więc proszę o wyrozumiałość.

Napisałem taki prosty programik, który zamienia litery na liczby, którymi tak na prawdę są.
Oto kod programiku:

#include <iostream>
#include <conio.h>
using namespace std;

int main()
{
    char litera;
    cout << "Wprowadz litere: ";
    cin >> litera;
    int numer = litera;
    cout << "Litera: " << litera << " ma wartosc: "
         << " dec: " << dec << numer << " hex: " << hex << numer;

    getch();
    return 0;
}

Moje pytanie: dlaczego wszystkie polskie litery mają wartości ujemne np. jak wpiszę "ą" to dostaję:
wartość int = -91 (minus) a wartość hex = ffffffa5, przy czy czym prawidłowa jest wartość a5 (dla kodowania CP852). Dlaczego to tak wygląda i skąd wzięły się te wartości ffffff, bo wygląda na to, że jak się je odetnie, to te pozostałe dwie pokazują prawidłową wartość ze strony kodowej CP852. Problem w tym, że w wartościach hex ffffffa5 to nie to samo co 000000a5.

Kiedy wpisuję normalne (nie polskie) litery to wszystko się zgadza i wartości liter są "normalne".

Siedzę już nad ta zagadką 2 godz. i za nic nie mogę pojąć co jest grane.

0

int ma z reguły 4 bajty, char ma 1. Do tego najwyraźniej u Ciebie char jest typem ze znakiem. A516 jest wartością -9110 w 8-bitowym U2. Liczby ze znakiem są rozszerzane tak aby zachować wartość, tj. char o wartości -91 po przypisaniu do inta nadal będzie skutkował wartością -91. Tylko -91 w 32-bitowym U2 to FFFFFFA516.

Jak chcesz tego uniknąć to po prostu wynik konwersji obetnij do 1 bajtu (cout << hex << (numer & 0xFF)).

2

Twój kompilator zdefiniował char jako typ znakowy, stąd albo włączysz odpowiednią opcję, albo zamień "char" na "unsigned char".

http://stackoverflow.com/questions/2054939/is-char-signed-or-unsigned-by-default

0

Dzięki wielkie.

Zmieniłem char na unsigned char i teraz wszystko wygląda OK, chociaż jeszcze do końca tego nie ogarniam :(

0

Pomóżcie mi jeszcze proszę w ustaleniu strony kodowej takiego tekstu:

SPúťKA AKCYJNA ul.Dĺuga 29 53-657 ťODí

a prawidłowe znaki to:

SPÓŁKA AKCYJNA ul. Długa 29 53-657 ŁÓDŹ

Nie mogę dojść jak to jest zakodowane. Przeglądałem różne tabele kodowe ale nie znalazłem właściwej. Używałem nawet programu Gżegżółka ale żadna z transformacji, którą robiłem w tym programie nie była właściwa.
Ten programik, który napisałem wyżej, miał mi posłużyć do znalezienia właściwej tablicy kodowej ale niestety nie znalazłem.

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