在 8 位平台上,我用 4 个 8 位整数组成一个无符号 32 位整数,如下所示:
uint8_t buf[4];
uint32_t large = 0;
large |= ((uint32_t)buf[0]) << 24;
large |= ((uint32_t)buf[1]) << 16;
large |= buf[2] << 8;
large |= buf[3] << 0;
如果没有强制转换,编译器会抱怨:
bmp.c:100:23: warning: left shift count >= width of type [-Wshift-count-overflow]
100 | large |= (buf[1]) << 16;
| ^~
这些演员阵容是否昂贵(我猜是的)并且可以更有效地完成吗?
这些演员阵容很贵吗(我猜是的)……
没有。
...这可以更有效地完成吗?
使用移位和 OR 将字节合并为多字节字的习语知识早已内置于 GCC 中。您可以检查生成的程序集以确定。如果它不是最佳的,您可以将其重写为分配给
large
一次的单个表达式,而不是一次初始化,然后再进行四个单独的复合分配。