Объединить 4 символа в один беззнаковый длинный

Я просто хочу объединить 4 символа в одну длинную переменную без знака, как показано ниже.

char y[16];
unsigned long Timer ;

y[12] = '1' ;
y[13] = '0' ;
y[14] = '1' ;
y[15] = '1' ; 
Timer  =   y[15] - '0' ;
Timer |=  (unsigned long) (y[12] - '0' << 24);
Timer |=  (unsigned long) (y[13] - '0'  << 16);
Timer |=  (unsigned long) (y[14] - '0'  << 8);

printf("%lu" , Timer);

Я хочу, чтобы таймер был равен 1011, но я продолжаю получать 1 в качестве вывода.


person Ammar    schedule 30.12.2014    source источник
comment
есть проблема с расположением скобок. значения y[] являются байтами, поэтому сдвиг байта на 8 или более битов влево приводит к 0. предполагают '(unsigned long)(y[12] - '0') ‹‹ 24;' и аналогично для следующих двух строк.   -  person user3629249    schedule 31.12.2014
comment
Стоит спросить, какой тип процессора/компилятора вы используете. В частности, это unsigned long 32 бита? Это тоже размер слова? Что такое порядок байтов? Некоторые ответы на этот вопрос, в которых используются операции сдвига, могут быть не переносимы на другой процессор, который не имеет такого же порядка следования байтов. РЕДАКТИРОВАТЬ: я вижу ваш тег MPLAB, поэтому я предполагаю, что вы используете PIC, верно? Если да, то 16 бит или 32?   -  person Nick    schedule 31.12.2014
comment
Я использую PIC18, но на вопрос уже ответили ниже.   -  person Ammar    schedule 31.12.2014


Ответы (1)


Это должно сработать для вас:

(Вам просто нужно знать приемы)

#include <stdio.h>

int main() {

    char y[16];
    unsigned long Timer ;

    y[12] = '1';
    y[13] = '0';
    y[14] = '1';
    y[15] = '1';

    Timer = y[12] - '0';  //- '0' To get the digit, here 1, and this for every digit
    Timer = (Timer * 10) + y[13] - '0';  //*10 to make place for the next digit, and this for every digit (expect the 1st one)
    Timer = (Timer * 10) + y[14] - '0';
    Timer = (Timer * 10) + y[15] - '0';

    printf("%lu" , Timer);

    return 0;

}

Вывод:

1011
person Rizier123    schedule 30.12.2014
comment
Можете ли вы добавить какое-то объяснение, ответьте только кодом со строкой. Это должно сработать для вас: не очень полезно. Объяснение этих трюков - это то, что ищет OP, а не код, который он может скопировать/вставить. - person 2501; 30.12.2014