Странный вывод массива char

Я использую

void func(char* m)
{
    for(int i = 0;i < 16;i++)
    {
        std::cout << (int)m[i] << std::endl;
    }

}

int main()
{
    char m[] = { 0x2b, 0x28, 0xab, 0x09,
                 0x7e, 0xae, 0xf7, 0xcf,
                 0x15, 0xd2, 0x15, 0x4f,
                 0x16, 0xa6, 0x88, 0x3c };
    func(*m);

}

Вывод получаеться такой

43
40
-85
9
126
-82
-9
-49
21
-46
21
79
22
-90
-120
60

Вопрос откуда взялись все эти отрицательные числа? Например вместо -85 должно быть 171 так как 0xab в десятичной системе равна 171, тогда откуда -85?


Ответы (1 шт):

Автор решения: Герман Борисов

В зависимости от типа и настроек компилятора тип char может быть как знаковым, так и беззнаковым.

Знаковые числа на всех популярных архитектура хранятся в дополнительном коде.

Беззнаковое 171 и знаковое -85 имеют одинаковое представление в памяти 0xAB = 10101011b

Ответ на прямой вопрос "Вопрос откуда взялись?" — вы их сами указали.

"Как исправить?" — явно использовать беззнаковый тип unsigned char

Могу ошибаться, но вроде бы, char, signed char и unsigned char — это три разных типа (в отличии, например от int и signed int, которые являются синонимами), и использовать просто char для числе не совсем корректно.

→ Ссылка