Mui*_*uis 3 c embedded gcc c99 integer-division
我正在研究一个没有硬件分区的Cortex M0 cpu,所以每次分割一些东西时,都会使用GCC库函数.现在,我做的最多的除法之一就是除以256,将短路转换为字节.有没有什么方法可以比默认的GCC库更有效地(比如通过位移)做到这一点?
根据您的意见,您希望-32768映射到0,32767映射到255.因此,您想要的公式是:
short s = /* input value */;
unsigned char c = (unsigned char) ((s + 32768) / 256);
Run Code Online (Sandbox Code Playgroud)
其他评论者已经注意到你可以用右移或其他各种策略来划分256分,这是真的 - 合理的版本是:
unsigned char c = (unsigned char) ((s + 32768) >> 8);
Run Code Online (Sandbox Code Playgroud)
但是,不需要这样的优化.GCC非常聪明地将逐行操作转换为特殊情况实现,在这种情况下,它将这两者编译成完全相同的代码(使用-O2 -mcpu=cortex-m0 -mthumb和GCC 4.7.2 测试):
mov r3, #128
lsl r3, r3, #8
add r0, r0, r3
lsr r0, r0, #8
uxtb r0, r0
Run Code Online (Sandbox Code Playgroud)
如果你试图过于聪明(就像在其他答案中使用union或指针演示的例子一样),你可能会混淆它并让事情变得更糟 - 特别是因为那些工作是由内存加载,并且添加32768意味着你已经拥有寄存器中的值.