C 仅使用整数缩放值

C 仅使用整数缩放值,c,mathematical-optimization,integer-division,C,Mathematical Optimization,Integer Division,我用C语言编写代码,我在微控制器上做了一些速度临界的计算,我想在不使用浮点变量的情况下找到数字的比率 我有一个介于0和255之间的字节,我想找到它的百分比。。 例如,如果我想找到75%的“值”,我使用的是这段代码 float x = value * 0.75; 其中“value”是介于0和255之间的数字 我能做一些聪明的数学运算来做这个计算吗?有没有办法放大数值,只使用整数除法进行计算?谢谢大家!我知道了 我的缩放值是一个介于0和256之间的数字-因此: percent = (value *

我用C语言编写代码,我在微控制器上做了一些速度临界的计算,我想在不使用浮点变量的情况下找到数字的比率

我有一个介于0和255之间的字节,我想找到它的百分比。。 例如,如果我想找到75%的“值”,我使用的是这段代码

float x = value * 0.75;
其中“value”是介于0和255之间的数字


我能做一些聪明的数学运算来做这个计算吗?有没有办法放大数值,只使用整数除法进行计算?

谢谢大家!我知道了

我的缩放值是一个介于0和256之间的数字-因此:

percent = (value * scaler) >> 8

首先要衡量这真的是一个瓶颈!今天,一些现代微控制器具有浮点单元。编译器可能会将其优化为您想要的操作。在继续之前测量并检查生成的代码。
int pct=(value*3)/4
不起作用吗?你在这里说的是什么百分比?有任意整数百分比吗?某些子集(如5%的增量)?数学不是特别聪明,你只需要决定你到底需要什么。然而,你确实需要谨慎。例如,您可以通过先乘以百分比数(例如,在75%的情况下乘以整数75%),然后整数除以100来计算任意百分比。但您必须处理可能的整数溢出。如果您的值是0到255,并且micro中的字大小是16位,这应该不是问题。您所说的“百分比定标器”是什么意思?你是说255代表100%?或者256实际上是100%,255只是差100%?这会让事情变得更容易。乘以定标器值,然后除以256,这是一个8位右移。如果255是100%,则乘以定标器值和整数除以255。对于0到100,可以有一个不太糟糕的查找表。提示:既然您说
value
是一个字节值,请先将其转换为更大的数据类型。否则,乘法很可能会溢出一个字节大小的变量,结果将是错误的。不要相信编译器会自动执行此操作。@bta
value*scaler
至少使用
int
wide math完成。C将整数升级指定为
*
@chux的一部分-一般来说,您是正确的,但是您必须小心使用微控制器。我已经不止一次被这个咬过了,尤其是在16位的微型机上。默认升级为常规的
int
,但您需要手动指定
unsigned int
uint16\u t
,以避免
255*255
溢出。我也使用micro。使用更兼容的C编译器会更有效率。Micros的编译器经常会遇到不可避免的问题,但我希望你能向它的制造商提交一份错误报告。@chux:标准只要求
int
能够支持-32767..32767的范围,所以16位int完全符合标准。。。