C 由四个 8 位整数组成无符号 32 位整数

问题描述 投票:0回答:1

在 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;
      |                       ^~

这些演员阵容是否昂贵(我猜是的)并且可以更有效地完成吗?

c avr-gcc
1个回答
0
投票

这些演员阵容很贵吗(我猜是的)……

没有。

...这可以更有效地完成吗?

使用移位和 OR 将字节合并为多字节字的习语知识早已内置于 GCC 中。您可以检查生成的程序集以确定。如果它不是最佳的,您可以将其重写为分配给

large
一次的单个表达式,而不是一次初始化,然后再进行四个单独的复合分配。

© www.soinside.com 2019 - 2024. All rights reserved.