2013-03-06 6 views

ответ

29

Вы можете использовать битовые операторы:

uint16_t wd = ((uint16_t)d2 << 8) | d1; 

Потому что:

(0x0002 << 8) | 0x01 = 0x0200 | 0x0001 = 0x0201 
+2

Да, это так. 'd2' нужно отдать первым (о чем отредактировал отредактированный пост). –

+0

@LuchianGrigore: О, да, я забыл об этом. Благодарю. – md5

+2

В ролях ** не требуется **. –

9

Самый простой способ:

256U*d2+d1 
+3

Aw. Теперь у нас действительно есть прецедент для побитовых операций, и вы все равно придерживаетесь скучной арифметики.;) –

+1

'<< 8' и' * 256' являются идентичными операциями, за исключением того, что первое имеет неопределенное поведение в большем количестве случаев и, как правило, нежелательно. Практически никогда не было причин использовать операторы '<<' or '>>, если правый операнд не является переменным (в этом случае у вас есть хороший оператор экспоненции). –

+2

Да, этот комментарий носил довольно юмористический характер. –

5

Это довольно просто. Вам не нужны никакие броски, вам не нужны временные переменные, вам не нужна черная магия.

uint8_t d1=0x01; 
uint8_t d2=0x02; 
uint16_t wd = (d2 << 8) | d1; 

Это всегда хорошо определяется поведение, так как d2 не всегда положительное значение, и никогда не переполняется, пока d2 <= INT8_MAX.

(INT8_MAX находится в stdint.h).

+0

... исключая если есть * нет * 0x7F (см. 5.2.4.2) – Sebivor

+0

@modifiablelvalue Акцент на _in practice_. Все разумные реализации используют wchar_t для больших целых чисел, если это вас беспокоит. Если ваша задача - это дополнения или знак и магниты, пожалуйста, сообщите мне, где их купить, потому что я тоже хочу! – Lundin

+0

@ Lundin Пожалуйста, прочтите 5.2.4.2.1p2 и руководство вашего компилятора ... Я уверен, что есть некоторые переключатели для переключения символов на * unsigned * типы, поскольку это очень распространенная практика. Обратите внимание, что процессоры DSP обычно определяют CHAR_BIT как 16 или 32. – Sebivor

Смежные вопросы