【问题标题】:Combine 4 chars into one unsigned long将 4 个字符组合成一个无符号长
【发布时间】:2015-02-26 23:44:16
【问题描述】:

我只想将 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);

我希望 Timer 等于 1011,但我一直得到 1 作为输出。

【问题讨论】:

  • 括号的位置有问题。 y[] 的值是字节,因此将一个字节向左移动 8 位或更多位会导致 0。建议 '(unsigned long)(y[12] - '0')
  • 值得一问,您使用的是什么类型的处理器/编译器。具体来说,是无符号长 32 位吗?这也是字的大小吗?什么是字节序?这个问题的一些使用移位操作的答案可能无法移植到另一个不具有相同字节序的处理器。编辑:我看到你的标签 MPLAB,所以我假设你使用的是 PIC,对吗?如果是这样,是 16 位还是 32 位?
  • 我正在使用 PIC18,但问题已在下面得到解答。

标签: c microcontroller mplab


【解决方案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

【讨论】:

  • 您能否添加一些解释,仅代码回答“这应该适合您:”这行不是很有帮助。这些“技巧”的解释是 OP 正在寻找的,而不是他可以复制/粘贴的代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-25
  • 2011-04-30
相关资源
最近更新 更多