2017-02-20 1 views
1

У меня есть массив символов, которые я использую для байт-кода. Печать их один за другим должны давать те же шестнадцатеричные значения, которые вы видите здесь:массив символов не правильно инициализирован

char toWrite[] = {'\x50','\x48','\xB8','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xFF','\xE0' }; 

Когда я пытаюсь напечатать эти значения в цикле, однако, они подогнаны. Вместо этого я вижу следующее:

50 48 ffffffb8 00 00 00 00 00 00 00 ffffffff ffffffe0 

Почему эти символы печатаются неправильно? Я итерация в цикле Еогеаспа, и каждый отдельный элемент передается

cout << hex << (int)currentChar << endl; 
+0

Одним из вариантов являются приведение по-разному, '(INT) (неподписанный символ) currentChar ' –

+1

Пожалуйста, не защищайте приведения стиля c, static_cast всегда должно быть предпочтительным, чтобы сообщить компилятору о намерении. – zett42

ответ

3

Для большинства систем, char составляет 8 бит в ширине и представляет собой целое число со знаком типа. Хранение \xB8 сделает свой самый старший бит 1, что сделает его отрицательным. И отбрасывание его на int также приведет к отрицательному значению, что приведет к 0xffffffb8, если int имеет ширину 32 бит.

Вы должны использовать unsigned char:

unsigned char toWrite[] = {/*...*/}; 

Кроме того, static_cast является более предпочтительным, чем C-стиль гипс:

cout << hex << static_cast<int>(currentChar) << endl; 
Смежные вопросы