Когато кодирах в C, случайно открих, че що се отнася до не-Ascii символи, след като се преобразуват от char
(1 байт) в int
(4 байта), допълнителните битове (3 байта) се допълват с 1, а не с 0. ( Що се отнася до символите Ascii, допълнителните битове се допълват с 0.) Например:
char c[] = "ā";
int i = c[0];
printf("%x\n", i);
И резултатът е ffffffc4
, а не самото c4
. (Кодът UTF-8 за ā е \xc4\x81
.)
Друг свързан проблем е, че при извършване на операции за десен преместване >>
върху не-Ascii знак, допълнителните битове в левия край също се допълват с 1, а не с 0, въпреки че променливата char е изрично преобразувана в unsigned int (за както за signed int, допълнителните битове се допълват с 1 в моята ОС). Например:
char c[] = "ā";
unsigned int u_c;
int i = c[0];
unsigned int u_i = c[0];
c[0] = (unsigned int)c[0] >> 1;
u_c = (unsigned int)c[0] >> 1;
i = i >> 1;
u_i = u_i >> 1;
printf("c=%x\n", (unsigned int)c[0]); // result: ffffffe2. The same with the signed int i.
printf("u_c=%x\n", u_c); // result: 7fffffe2.
printf("i=%x\n", i); // result: ffffffe2.
printf("u_i=%x\n", u_i); // result: 7fffffe2.
Сега съм объркан от тези резултати... Загрижени ли са за структурите от данни на char, int и unsigned int, или свързани с моята операционна система (ubuntu 14.04), или свързани с изискванията на ANSI C? Опитах се да компилирам тази програма както с gcc(4.8.4), така и с clang(3.4), но няма разлика.
Много благодаря!
char
е тип със знак. Ако иматеchar c;
, използвайтеi = (unsigned char)c;
, за да преобразуватеc
първо към тип unsigned char, така че кодът на знака винаги да е неотрицателен. - person Nominal Animal   schedule 06.08.2017-funsigned-char
. Но ако някой трябва да има 8-битова подписана или неподписана стойност, по-добре е да използва типове с фиксиран размер вместо 'char':uint8_t
илиint8_t
- person 0___________   schedule 06.08.2017unsigned char
иuint8_t
, всичко се връща към нормалното. Благодаря! @NominalAnimal @PeterJ - person none   schedule 07.08.2017uint8_t
съществува съвпада сunsigned char
- person Antti Haapala   schedule 07.08.2017