我试图获得一个长度为16位的数字0x1122334455667788并将其移位以考虑小端编号。
使用以下示例代码从内存单元格中加载数字
void endianCompute(memory_t memory, uint64_t start, uint64_t *save, int size){
*save = 0;
for(int i = 0; i < size; i++){
*save += memory[start + i] << (i)*8;
printf("add 0x%x\n", memory[start + i] << (i)*8);
printf("save 0x%x\n", *save);
}
}
输出产生:
save 0x88
add 0x7700
save 0x7788
add 0x660000
save 0x667788
add 0x55000000
save 0x55667788
add 0x44
save 0x556677cc
add 0x3300
save 0x5566aacc
add 0x220000
save 0x5588aacc
add 0x11000000
save 0x6688aacc
这对我有意义,直到添加0x44,为什么位移不继续将数字推到左边?为什么我无法将数字设为8位数?
答案 0 :(得分:3)
打开编译器警告,可能是-Wall
,然后显示问题。
cc -Wall -g test.c -o test
test.c:10:27: warning: format specifies type 'unsigned int' but the argument has type 'uint64_t'
(aka 'unsigned long long') [-Wformat]
printf("save 0x%x\n", *save);
~~ ^~~~~
%llx
您需要使用%llx
来打印64位整数(long long int)。