【发布时间】:2014-03-25 18:09:56
【问题描述】:
我有这个程序:
#include <stdio.h>
int main(void)
{
unsigned char unit_id[] = { 0x2B, 0xC, 0x6B, 0x54}; // 8-bit (1 byte)
unsigned long long int unit_id_val; //64-bit (8 bytes)
int i;
// loops 4 times
for(i=0;i<sizeof(unit_id)/sizeof(char);i++){
unit_id_val |= unit_id[i] << (8 * i);
}
printf("the unit id is %llu\n", unit_id_val);
return 0;
}
十六进制到二进制的转换:
0x2B = 00101011
0xC = 00001100
0x6B = 01101011
0x54 = 01010100
unit_id_val 为 8 个字节(我在下面为 unit_id_val 使用 5 个字节以简化事情)
1) 第一次迭代 8*0=0 所以不会发生左移:
00101011 = 00101011 << 0
00000000 00000000 00000000 00000000 00000000 |= 00101011
所以结果应该是:
00000000 00000000 00000000 00000000 00101011
2) 第二次迭代 8*1=8,所以将 unsigned char 0xC 的所有位左移 8:
00000000 = 00101011 << 8
00000000 00000000 00000000 00000000 00101011 |= 00000000
所以结果应该是:
00000000 00000000 00000000 00000000 00101011
3) 第三次迭代 8*2=16,因此将 unsigned char 0x6B 的所有位左移 16:
00000000 = 01101011 << 16
00000000 00000000 00000000 00000000 00101011 |= 00000000
所以结果应该是:
00000000 00000000 00000000 00000000 00101011
4) 第四次迭代 8*3=24,因此将 unsigned char 0x54 的所有位左移 32:
00000000 = 01010100 << 32
00000000 00000000 00000000 00000000 00101011 |= 00000000
所以结果应该是:
00000000 00000000 00000000 00000000 00101011
00101011 是 43
但是当你运行这个程序时,你会得到
1416301611
这是二进制:
00010100 00010110 00110000 00010110 00010001
我不明白这里的一些东西。我通过在评估左移运算符
【问题讨论】:
-
和 by 32 和
<< 32? -
一个
printf("%x\n", unit_id[i] << (8 * i));被扔进循环会告诉你你的假设在哪里是错误的。
标签: c bit-manipulation