У меня есть следующие данныеОбъединение двух uint8_t в uint16_t
uint8_t d1=0x01;
uint8_t d2=0x02;
Я хочу, чтобы объединить их в uint16_t
в
uint16_t wd = 0x0201;
Как я могу это сделать?
У меня есть следующие данныеОбъединение двух uint8_t в uint16_t
uint8_t d1=0x01;
uint8_t d2=0x02;
Я хочу, чтобы объединить их в uint16_t
в
uint16_t wd = 0x0201;
Как я могу это сделать?
Вы можете использовать битовые операторы:
uint16_t wd = ((uint16_t)d2 << 8) | d1;
Потому что:
(0x0002 << 8) | 0x01 = 0x0200 | 0x0001 = 0x0201
Самый простой способ:
256U*d2+d1
Aw. Теперь у нас действительно есть прецедент для побитовых операций, и вы все равно придерживаетесь скучной арифметики.;) –
'<< 8' и' * 256' являются идентичными операциями, за исключением того, что первое имеет неопределенное поведение в большем количестве случаев и, как правило, нежелательно. Практически никогда не было причин использовать операторы '<<' or '>>, если правый операнд не является переменным (в этом случае у вас есть хороший оператор экспоненции). –
Да, этот комментарий носил довольно юмористический характер. –
Это довольно просто. Вам не нужны никакие броски, вам не нужны временные переменные, вам не нужна черная магия.
uint8_t d1=0x01;
uint8_t d2=0x02;
uint16_t wd = (d2 << 8) | d1;
Это всегда хорошо определяется поведение, так как d2 не всегда положительное значение, и никогда не переполняется, пока d2 <= INT8_MAX
.
(INT8_MAX находится в stdint.h).
... исключая если есть * нет * 0x7F (см. 5.2.4.2) – Sebivor
@modifiablelvalue Акцент на _in practice_. Все разумные реализации используют wchar_t для больших целых чисел, если это вас беспокоит. Если ваша задача - это дополнения или знак и магниты, пожалуйста, сообщите мне, где их купить, потому что я тоже хочу! – Lundin
@ Lundin Пожалуйста, прочтите 5.2.4.2.1p2 и руководство вашего компилятора ... Я уверен, что есть некоторые переключатели для переключения символов на * unsigned * типы, поскольку это очень распространенная практика. Обратите внимание, что процессоры DSP обычно определяют CHAR_BIT как 16 или 32. – Sebivor
Да, это так. 'd2' нужно отдать первым (о чем отредактировал отредактированный пост). –
@LuchianGrigore: О, да, я забыл об этом. Благодарю. – md5
В ролях ** не требуется **. –