当我打算从autosar规范中实现2n可缩放整数的16位加法时。我没有得到这些中的a,b和c值。
我将为autofs规范为mfx模块实现2n可缩放整数的16位加法。在其中我获得了8.6.4.1 2n可缩放整数的16位加法,其中 第一个定点操作数的小数点位置。必须是一个常量表达式。 b第二个定点操作数的基数点位置。必须是一个常量表达式。 c定点结果的小数点位置。必须是一个常量表达式。
有效范围:0≤| a-b | ≤15
(c-b)≤15,(a-c)≤15,a≥b
(c-a)≤15,(b-c)≤15,a
但是我不明白如何获得c的范围值。
对于以下情况
#include "stdio.h"
void main()
{
if(a > =b)
C = 2^(c-a) * [x + (y * 2^(a-b))]
else
C = 2^(c-b) * [(x * 2^(b-a)) + y].
}
如果x = 10,y = 10,a = 20,b = 10和c = 100,则ans是什么;
答案 0 :(得分:2)
似乎您将数学方程式转换为C源代码时遇到问题。请注意,在数学中,2 ^ n表示将2乘幂n。因此,如果n> = 0,则m * 2 ^ n表示m * 2 ^ abs(n),如果n <0,则表示m /(2 ^ abs(n))。
因此,阅读spec, page 53-54,例如:
#include <stdint.h>
uint16_t Mfx_AddP2_u16u16_u16(uint16_t x, uint16_t y, int16_t a, int16_t b, int16_t c)
{
if(a>=b)
{
if(((a-b)>15) || ((c-b)>15) || ((a-c)>15))
{
//SWS_Mfx_00154 - saturate to boundary value
return UINT16_MAX;
}
else
{
uint32_t baseValue = (UINT32_C(1) << (a-b)) * y + x;
if(c>=a)
{
return (uint16_t)(baseValue << (c-a));
}
else
{
//SWS_Mfx_00155 - round to zero
return (uint16_t)(baseValue >> (a-c));
}
}
}
else
{
if(((b-a)>15) || ((c-a)>15) || ((b-c)>15))
{
//SWS_Mfx_00154 - saturate to boundary value
return UINT16_MAX;
}
else
{
uint32_t baseValue = (UINT32_C(1) << (b-a)) * x + y;
if(c>=b)
{
return (uint16_t)(baseValue << (c-b));
}
else
{
//SWS_Mfx_00155 - round to zero
return (uint16_t)(baseValue >> (b-c));
}
}
}
}
我相信您可以类似地完成以下声明的功能:
uint16_t Mfx_AddP2_u16s16_u16(uint16_t x, int16_t y, int16_t a, int16_t b, int16_t c);
uint16_t Mfx_AddP2_s16s16_u16( int16_t x, int16_t y, int16_t a, int16_t b, int16_t c);
int16_t Mfx_AddP2_u16u16_s16(uint16_t x, uint16_t y, int16_t a, int16_t b, int16_t c);
int16_t Mfx_AddP2_u16s16_s16(uint16_t x, int16_t y, int16_t a, int16_t b, int16_t c);
int16_t Mfx_AddP2_s16s16_s16( int16_t x, int16_t y, int16_t a, int16_t b, int16_t c);
注意:注意带符号的参数和返回值。
编辑:回答实际问题
假设您问x = 10,y = 10,a = 20,b = 10和c = 100时结果是什么; 检查:
因此,就SWS_Mfx_00154而言,结果必须为
, 和