Странный вывод массива 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 для числе не совсем корректно.