1 / 1 / 1
Регистрация: 19.02.2012
Сообщений: 24
1

Преобразование uint16_t в int

10.03.2016, 12:06. Показов 10051. Ответов 10
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день!
Получает моя программа 2 байта в которых хранится число -100.
b1=156;
b2=255;

Полученные байты мне надо представить для моей программы опять же в виде числа -100:
C++
1
2
3
4
5
    int k=0;
    uint8_t b1=156;
    uint8_t b2=255;
 
    k=b2<<8 | b1;
В результате получаю k=65436.

Не могу понять, почему k представляется как uint16_t, если я его обьявил как int?
Подскажите как мне правильно преобразовать!
1
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.03.2016, 12:06
Ответы с готовыми решениями:

Как происходит преобразование int<<float<int
Как происходит преобразование int&lt;&lt;float&lt;int int n=222222222; float f=(float)n; n=(int)f;...

Какая из этих функций int Q(int w) int W(int y,int u,int i) сработает быстрее?
Если есть 2 функции(простые или перегруженные) к примеру Q(int w) int W(int y,int u,int i)или int...

Преобразование int в string
не могу не как реализовать преобразование int в string, подскажите как это сделать ? например число...

Преобразование int в CString ?
Подскажите как преобразовать? itoa преобразовует в *char, а хотелось бы сразу в CString...

10
Эксперт .NET
12074 / 8383 / 1281
Регистрация: 21.01.2016
Сообщений: 31,578
10.03.2016, 12:19 2
Замени uint8_t на char
0
15 / 15 / 8
Регистрация: 02.03.2016
Сообщений: 37
10.03.2016, 12:22 3
C++
1
int16_t f = b2<<8 | b1;
Далее просто присвой результат своему k
C++
1
k = f;
1
1 / 1 / 1
Регистрация: 19.02.2012
Сообщений: 24
10.03.2016, 12:29  [ТС] 4
Цитата Сообщение от nikniknik2016 Посмотреть сообщение
C++Выделить код
1
int16_t f = b2<<8 | b1;
Спасибо работает!
А что с типом int не так? Есть разница между int и int16_t?
0
5231 / 3204 / 362
Регистрация: 12.12.2009
Сообщений: 8,113
Записей в блоге: 2
10.03.2016, 12:39 5
Цитата Сообщение от MarkTwis Посмотреть сообщение
А что с типом int не так?
все так, т.к. у тебя число отрицательное тебе надо расширить знаковые биты, а ты этого не делаешь. С 16 битным типом работает, потому что там расширять не надо.

Твой код из первого поста можно изменить вот так
C++
1
2
3
4
5
    int k = 0;
    int8_t b1 = 156;
    int8_t b2 = 255;
 
    k = b2 << 8 | b1;
т.е. используется знаковый тип, знаковые биты будут учтены при сдвиге.

Цитата Сообщение от Usaga Посмотреть сообщение
Замени uint8_t на char
char не является signed по умолчанию, просто в тех компиляторах, с которыми большинство из нас работает, он signed. Но стандарт говорит, что это implementation defined, т.е. где-то может быть unsigned, тогда получим результат из первого поста.
2
1 / 1 / 1
Регистрация: 19.02.2012
Сообщений: 24
10.03.2016, 12:56  [ТС] 6
Цитата Сообщение от Kastaneda Посмотреть сообщение
все так, т.к. у тебя число отрицательное тебе надо расширить знаковые биты, а ты этого не делаешь. С 16 битным типом работает, потому что там расширять не надо.
Как понять "расширеть знаковые биты"? Не пойму как происходит преобразование?
0
5231 / 3204 / 362
Регистрация: 12.12.2009
Сообщений: 8,113
Записей в блоге: 2
10.03.2016, 13:00 7
MarkTwis, ну 255 это минус 1, это понимаешь?
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
10.03.2016, 13:04 8
Kastaneda, что-то я тоже не понял с вашего объяснения почему надо было менять типы контейнеров битов, а не кастить явно в строке k = b2 << 8 | b1; - ведь проблемма как я понял в b2 << 8 где левый оперант unsigned и правый signed и их результат будет unsigned
0
5231 / 3204 / 362
Регистрация: 12.12.2009
Сообщений: 8,113
Записей в блоге: 2
10.03.2016, 13:10 9
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
ведь проблемма как я понял в b2 << 8 где левый оперант unsigned и правый signed и их результат будет unsigned
нет, проблема в том, что 255 это минус 1. Делаем сдвиг влево (неявно кастуем к инту), если сдвигаемый тип знаковый, то при касте он расширится знаковым битом (для минус 1 получим все старшие биты 1), если сдвигаемый тип беззнаковый, то при касте он не расширится знаковым битом (для минус 1 получим все старшие биты 0). Отсюда и проблема.

Добавлено через 2 минуты
чтоб было понятней, 255 (или минус 1) это 11111111, кастуем к инту
- если тип знаковый, то результат 11111111 11111111 11111111 11111111
- если тип беззнаковый, то результат 00000000 00000000 00000000 11111111
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
10.03.2016, 13:26 10
Kastaneda, Во теперь понятнее) P.S. после добавления примера))))
0
1 / 1 / 1
Регистрация: 19.02.2012
Сообщений: 24
10.03.2016, 16:50  [ТС] 11
Цитата Сообщение от Kastaneda Посмотреть сообщение
MarkTwis, ну 255 это минус 1, это понимаешь?
Это я понимаю! )))

Добавлено через 27 секунд
Цитата Сообщение от Kastaneda Посмотреть сообщение
Сообщение от rikimaru2013
ведь проблемма как я понял в b2 << 8 где левый оперант unsigned и правый signed и их результат будет unsigned
нет, проблема в том, что 255 это минус 1. Делаем сдвиг влево (неявно кастуем к инту), если сдвигаемый тип знаковый, то при касте он расширится знаковым битом (для минус 1 получим все старшие биты 1), если сдвигаемый тип беззнаковый, то при касте он не расширится знаковым битом (для минус 1 получим все старшие биты 0). Отсюда и проблема.
Добавлено через 2 минуты
чтоб было понятней, 255 (или минус 1) это 11111111, кастуем к инту
- если тип знаковый, то результат 11111111 11111111 11111111 11111111
- если тип беззнаковый, то результат 00000000 00000000 00000000 11111111
Теперь понятно и со знаковыми переменными
0
10.03.2016, 16:50
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.03.2016, 16:50
Помогаю со студенческими работами здесь

Преобразование LPVOID в int
Собственно вопрос в коде #include &lt;Windows.h&gt; #include &lt;stdio.h&gt; DWORD WINAPI Func(LPVOID); ...

Преобразование string в int
подскажите, как правильно преобразовать string в int без изменения строк 7-8 и без sscanf ? ...

Преобразование 4-х байтов в int
Приветствую, в общем пытаюсь считать 4 байта с файла и собрать их в одно число типа int в...

Преобразование string в int
нужно текст (string) из textBox преобразовать в число (int)


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru