0

前几天我在查看哈希函数,偶然发现了一个网站,其中有一个例子。大多数代码都很容易掌握,但是这个宏功能我真的无法理解。

有人可以分解这里发生了什么吗?

#define get16bits(d) ((((uint32_t)(((const uint8_t *)(d))[1])) << 8) +(uint32_t)(((const uint8_t *)(d))[0]))
4

2 回答 2

1

该宏或多或少等同于:

static uint32_t get16bits(SOMETYPE *d)
{
unsigned char temp[ sizeof *d];
uint32_t val;

memcpy(temp, d, sizeof *d);

val = (temp[0] << 8)
     + temp[1];
return val;
}

,但宏参数没有类型,而函数参数有。

另一种方法是实际投射:

static uint32_t get16bits(SOMETYPE *d)
{
unsigned char *cp = (unsigned char*) d;
uint32_t val;

val = (cp[0] << 8)
     + cp[1];
return val;
}

,这也显示了弱点:通过使用 1 进行索引,代码假定 sizeof (*d) 至少为 2。

于 2012-05-15T15:09:53.913 回答
1

基本上它得到 32 位整数 d 的低 16 位

让我们分解一下

#define get16bits(d) ((((uint32_t)(((const uint8_t *)(d))[1])) << 8) +(uint32_t)(((const uint8_t *)(d))[0]))
uint32_t a = 0x12345678;
uint16_t b = get16bits(&a); // b == 0x00005678

首先我们必须传递 a 的地址,get16bits()否则它将不起作用。

(((uint32_t)(const uint8_t *)(d))[1])) << 8

这首先将 32 位整数转换为 8 位整数数组并检索 2 个整数。然后它将值移动 8 位,因此它并将低 8 位添加到它

+ (uint32_t)(((const uint8_t *)(d))[0]))

在我们的示例中,它将是

uint8_t tmp[4] = (uint8_t *)&a;
uint32_t result;
result = tmp[1] << 8; // 0x00005600
result += tmp[0]; //tmp[0] == 0x78
// result is now 0x00005678
于 2012-05-15T15:14:26.940 回答