从数组中简单的unsigned long long转换

时间:2013-06-04 09:38:39

标签: c bit-manipulation

我有一个8字节的计数器,我试图增加。我后来想将它转换为unsigned long long值。但转换后的值会引发错误。这是一些端点问题还是错误地完成了? 请指教。

这是我的代码:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
typedef unsigned          char uint8_t;
typedef unsigned short     int uint16_t;
typedef unsigned           int uint32_t;

#define COUNTER_LENGTH 8

typedef struct {
    uint8_t data[8];
}count_t;

static void incrementCtr(count_t* count) {
    int i;
    for (i = sizeof(count->data) - 1; i >= 0; --i) {
        if (++count->data[i] != 0) {
            break;
        }
    }
}

int main(int argc, char *argv[]){

    count_t count;
    count_t *counter;
    counter = &count;
    memset(counter ,0,sizeof(*counter));

    incrementCtr(counter);
    int i;
    for (i = 0; i < COUNTER_LENGTH; i++){
        printf("counter->data[%d] = %02X\n", i, counter->data[i]);
    }

    unsigned long long  aa = 0;
    int m;
    for(m = 0; m< COUNTER_LENGTH; m++){
        aa = aa |(counter->data[m]<< m*8);
    }
    printf("aa = %llu\n", aa);
    return 0;
}

1 个答案:

答案 0 :(得分:1)

咦?

如果您确定unsigned long long足够大,那么为什么还要为手动实施而烦恼呢?为什么不使用unsigned long long变量?

你的循环中有一些破碎;表达式(counter->data[m] << m * 8)没有类型unsigned long long,因此可能会丢失很多位。

使用类似的东西:

for(m = 0; m < COUNTER_LENGTH; ++m)
{
  a <<= 8;
  a |= counter->data[m];
}

以上也应该是endian-safe;它始终是OR:首先是最重要的字节(由counter表示确定)。