为图表数据处理整数溢出
当整数溢出可以发生
对于一些算术运算,处理器可能需要一个n
位定点值并将其存储在米
位,米
≠n
。如果米
<n
,减少范围的值会导致一个溢出的算术运算。一些处理器识别这个溢出正
或南
。其他处理器,特别是数字信号处理器(dsp),处理由饱和溢出或包装的价值。
更多信息关于整数溢出,饱和度和包装<一个href="//www.tatmou.com/ch/ch/help/fixedpoint/ug/saturation-and-wrapping.html" class="a">饱和度和包装(定点设计师)。
金宝app支持处理整数溢出图表
对于Stateflow®图表在仿真软件金宝app®模型中,您可以控制是否饱和出现整数溢出。控制溢出处理设置浸透在整数溢出图表属性中描述<一个href="//www.tatmou.com/ch/ch/help/stateflow/ug/specifying-chart-properties.html" class="a">指定属性Stateflow图表。
图表属性设置 | 何时使用此设置 | 溢出处理 | 结果的例子 |
---|---|---|---|
选择 | 溢出的数据在你的图表和你想要显式饱和保护在生成的代码中。 | 溢出的最小值或最大值,数据类型可以表示。 | 一个签署了8位整数溢出与浸透到-128或+ 127在生成的代码中。 |
清除 | 你想优化生成的代码的效率。 | 溢出的处理取决于您使用的C编译器生成代码。 | 数字130不符合-126年签署了8位整数和包裹在生成的代码。 |
算术运算的您可以启用饱和保护:
一元-:-
一个
二进制操作:
a + b
,一个
- - - - - -b
,a * b
,a / b
,a ^
赋值操作:
+ = b
,一个
- - - - - -= b
,* = b
,a / b =
在C语言中图表、递增和递减操作:
+ +
,- - -
当您选择浸透在整数溢出请注意:
饱和适用于所有中间业务部门,而不只是输出或最终结果。
代码生成器可以检测某些情况下当溢出是不可能的。在这些情况下,生成的代码不包括饱和保护。
以决定是否清除浸透在整数溢出复选框是一个安全的选择,执行一个仔细分析你的逻辑,必要时包括模拟。如果只有部分的饱和度是必要的逻辑,封装逻辑原子子图表或MATLAB函数和定义一组不同的饱和度设置单位。
整数提升规则对饱和度的影响
图表的使用ANSI®C规则整数提升。
所有算术操作使用相同的数据类型长度作为目标词的大小。因此,中间数据输入链接算术运算操作数的数据类型可以不同或最终结果。
操作数的整数类型大小小于目标词,推广到更大的类型相同的单词长度作为目标大小发生。这个隐式发生任何算术运算之前发生。
例如,当目标词的大小是32位的,一个隐式的演员
int32
发生的操作数的类型uint8
,uint16
,int8
,或int16
任何算术运算之前发生。
假设您有以下表达式,y
,u1
,u2
,u3
的uint8
类型:
y = (u1 + u2)——u3;
基于整数晋升规则,表达相当于以下语句:
uint8_T u1, u2, u3, y;int32_T tmp,结果;tmp = (int32_T u1) + (int32_T) u2;结果= tmp - (int32_T) u3;y = (uint8_T)结果;
对于每一个计算,以下数据类型和饱和限制适用。
计算 | 数据类型 | 饱和限制 |
---|---|---|
tmp |
int32 |
(MIN_INT32 MAX_INT32) |
结果 |
int32 |
(MIN_INT32 MAX_INT32) |
y |
uint8 |
(MIN_UINT8 MAX_UINT8) |
假设u1
,u2
,u3
是等于200。因为饱和限制取决于中间数据类型而不是操作数类型,得到以下值:
tmp
是400。结果
是200。y
是200。
饱和度对错误检查的影响
如果你启用表属性浸透在整数溢出并设置配置参数包装上溢出来错误
或警告
,Stateflow图表不国旗整数溢出的情况下在模拟。然而,继续国旗除零操作,超出范围的图表数据违反基于最小值和最大值范围检查。