您的位置 首页 资料

DSP里的数据类型,你都认得它们么

DSP的C/C++编程时有多少种数据类型?float,double和longdouble,long和longlong这些绕口的名字究竟有什么区别?数据类型使用不正确又会有什么后果?如果你感觉说不清楚,

  DSPC/C++编程时有多少种数据类型?float,double和long double,long和long long这些绕口的姓名终究有什么差异?数据类型运用不正确又会有什么结果?假如你感觉说不清楚,那咱们来看看这些究竟都是何方神圣吧:

表1 C28xC/C++支撑的数据类型


Ø 64位整数的处理

  从上面的表中,能够看出C28x的编译器是支撑64位的整数类型的,这使得在处理某些高精度智能编码器的反应数据时特别便利,由于在更老的不支撑64位整数类型的器材上编程时,需求咱们自己界说64位类型,在运算时要自己界说运算规矩才行。一个long long类型的整数需求运用ll或许LL前缀,才干被I/O正确处理,例如,咱们运用下面的代码才干正确把它们显现在屏幕上:

  printf(“%lld”, 0x0011223344556677);

  printf(“%llx”, 0x0011223344556677);

  需求留意的是,尽管编译器支撑了64位整数,可是实践的CPU的累加器还有相关的CPU寄存器仍是32位的,在程序运行时,64位整数类型是被CPU“软支撑”的。咱们能够增加相关的实时运行库来进步功率,其间包含了llabs(), strtoll() 和strtoull()等函数。

  Ø 浮点的处理

  从表1中咱们能够看出,C28x的编译器支撑32位的单精度浮点、64位的单精度和双精度浮点运算。在界说双精度64位变量时,也要记住运用l或许L前缀,不然会被视为双精度的32位变量,形成精度的丢失。例如:

  long double a = 12.34L; /* 初始化为双精度64位浮点 */

  long double b = 56.78; /* 把单精度浮点强制类型转化为双精度浮点 */

  在I/O处理时,也要标有相关的前缀,例如:

  printf(“%Lg”, 1.23L);

  printf(“%Le”, 3.45L);

  需求留意的是,尽管编译器支撑了双精度浮点,可是FPU只支撑硬件的32位单精度浮点,在程序运行时,双精度浮点类型是被CPU“软支撑”的。特别是long double的操作,需求多个CPU寄存器的合作才干完结(代码尺度和执行时间都会变长);在多个long double操作数的情况下,前两个操作数的地址会传递到CPU辅佐寄存器XAR4和XAR5中,其它的地址则被放置在栈中。例如下面的代码中:

  long double foo(long double a, long double b, long double c)

  {

  long double d = a + b + c;

  return d;

  }

  long double a = 1.2L;

  long double b = 2.2L;

  long double c = 3.2L;

  long double d;

  void bar()

  {

  d = foo(a, b, c);

  }

  在函数bar()中调用foo的时分,CPU寄存器的值为:

  
CPU寄存器寄存器的值:

  在C28x的浮点操作中,以加法为例,其汇编代码是有差异的:

  LCR FS$$ADD ; 单精度加法

  LCR FD$$ADD ; 双精度加法

  一般情况下,没有特别的需求,完全能够不实用双精度的浮点,例如在电机控制体系中,由于A/D采样的精度约束,整个体系的精度是无法完成那么高的精度的。

  Ø 数据类型许多,运用时一定要当心

  单精度与双精度,有符号与无符号,一个大于65535的数赋给16位宽的类型……这些转化都是危险重重,运用一定要当心啊!例如:

   假如你用Excel剖析比照数据

  记住Excel中浮点类型只能运用双精度的浮点数。所以假如你把DSP中单精度的浮点数据取出放入Excel中,发现数据发生了改变,就不会觉得奇怪了。例如,单精度浮点的0.2放到Excel,就变成0.200000002980232了。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/ziliao/226889.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部