Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在16位处理器中获得2个数字平均值的C程序_C_Embedded_Overflow - Fatal编程技术网

在16位处理器中获得2个数字平均值的C程序

在16位处理器中获得2个数字平均值的C程序,c,embedded,overflow,C,Embedded,Overflow,我们如何用C语言编写一个程序,在16位处理器上计算2个16位有符号数字的平均值 int getAverage(int x, int y) { int result=0; result = ((x+y)/2); return result; } 上述方法适用于大多数情况,但x和y都是最大值65535的情况除外。在x和y都是正数或负数的情况下,我会将两个数字之间的差值除以2,然后将结果与减去的数字相加。从数学上讲,这相当于您当前拥有的: (y-x)/2+x=y/2-x/2+x=

我们如何用C语言编写一个程序,在16位处理器上计算2个16位有符号数字的平均值

int getAverage(int x, int y)
{
   int result=0;
   result = ((x+y)/2);
   return result;
} 

上述方法适用于大多数情况,但x和y都是最大值65535的情况除外。

在x和y都是正数或负数的情况下,我会将两个数字之间的差值除以2,然后将结果与减去的数字相加。从数学上讲,这相当于您当前拥有的:

(y-x)/2+x=y/2-x/2+x=y/2+x/2=(x+y)/2


如果x为正,y为负,或者反之亦然,则应使用原始的计算方法。

最简单的可能解决方案,使用一些粗略的整数舍入:

int32_t getAverage (int16_t x, int16_t y)
{
   int32_t sum = (int32_t)x + (int32_t)y;
   return sum/2 + sum%2;
} 

这将很好地工作,因为您的16位编译器将具有处理32位整数的软件例程

当x+y>32767(或<-32768)时,它就不起作用了,这是很多情况下的情况。但解决方案只是使用一个
int32_t
进行中间计算。除以hi(8位)和low(8位)等部分,然后尝试对它们进行计算(当然,将四个部分提升为16位)检查溢出等,但处理符号可能是个骗局。提示:(x+y)/2=x/2+y/2。好的,在整数情况下,如果x和y是奇数,您可能需要加1…重要的因素不是ALU的宽度是多少,而是编译器认为int的范围是多少。当然,大多数编译器的可用数据类型都大于其int值,如果不是,它们总是可以通过执行部分操作的库进行扩展worked@WeatherVane:是的,我把它删掉了,因为还是有些地方不对劲。例如,对于
x=3
y=-4
,显然存在
-1/2
,即零。但是
3/2-4/2+(3%2-4%2)/2=1-2+(1-0)/2=-1+1/2=-1+0=-1
。向下的平均值可以用“如果”来固定。我喜欢这个解决方案。我也在寻找一种方法来解决这个问题。您的上述解决方案也解决了这一问题。谢谢,如果您在实践中实现这一点,它很可能比将整数转换为32位慢得多。所有这些划分都不能被编译器轻易地优化掉,而且在较小的CPU上,划分往往是一个速度瓶颈。我喜欢这种方法,因为将来可以清楚地看出其意图。不过,我不确定四舍五入是否是一项要求。