Вот то, чего я не ожидал. Мне нужно написать небольшое приложение, которое отправляет значения через последовательный порт, но значения превышают 127. После просмотра документации по Qt здесь: http://qt-project.org/doc/qt-5.1/qtserialport/qserialport.html — если я не пропустил что-то очевидное, метод QSerialPort :: write (), похоже, не поддерживает ничего выше 127 (десятичное).
Мне, например, случается, что мне нужно отправить 0xFF (255 десятичное число), так как я могу отправить это, когда кажется, что методы поддерживают только «подписанные» символы (опять же, если я что-то не упустил). Я искал версию методов write (), которые принимают «int» или неподписанный символ, который позволил бы мне идти до 255 в десятичном виде.
virtual qint64 writeData(const char * data, qint64 maxSize)
Видите, нет «unsigned char *» и нет «int», так как мне отправить массив из 5 значений, где каждое из них выше 127 (dec)?
Он отправляет данные как есть, а подписанный или неподписанный является проблемой интерпретации другой стороны.
-1 подписанный байт равен 0xff, так же, как 255 без знака.
Вы все еще можете отправлять байты со значениями выше 127.
Тип char со знаком просто означает, что ваши данные передаются методу в виде массива знаков со знаком (так что f.e unsigned 250 равен подписанному -6, но двоичные оба равны 250).
char * ptr = новый символ [5]; ptr [0] = 255; ShowMessage ((INT) PTR [0]);
С начала:
Прежде всего, проверьте эту статью вики: http://en.wikipedia.org/wiki/Two‘s_complement (фокус на 8-битной таблице целых чисел с двумя дополнительными числами)
Код дополнения 2 — это способ записи отрицательных значений в память вашего компьютера.
Сейчас:
Значение 255 в двоичном коде записывается как 1111 1111.
Значение -1 в коде дополнения 2 также записывается как 1111 1111.
Таким образом, тип без знака или со знаком, говорит вашему компилятору, как по рукам с этими значениями (как со знаком, так и без знака).
Теперь, что происходит, когда вы пытаетесь преобразовать char или unsigned char в integer.
Теперь конвертируем unsigned char в int:
Ваш компилятор лечит 1111 1111 как 255 и преобразовать его в 255 целое число.
Теперь конвертируем char в int:
Ваш компилятор лечит 1111 1111 как -1 и преобразовать его в -1 целое число.
Целое число -1 имеет двоичный код, отличный от значения -1 символа (из-за знакового бита).