我有一个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;
}
答案 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
表示确定)。