【发布时间】:2012-01-13 15:05:39
【问题描述】:
我之所以问这个是因为发生了以下情况:
在标题中定义:
typedef struct PID
{
// PID parameters
uint16_t Kp; // pGain
uint16_t Ki; // iGain
uint16_t Kd; // dGain
// PID calculations OLD ONES WHERE STATICS
int24_t pTerm;
int32_t iTerm;
int32_t dTerm;
int32_t PID;
// Extra variabels
int16_t CurrentError;
// PID Time
uint16_t tick;
}_PIDObject;
在 C 源代码中:
static int16_t PIDUpdate(int16_t target, int16_t feedback)
{
_PIDObject PID2_t;
PID2_t.Kp = pGain2; // Has the value of 2000
PID2_t.CurrentError = target - feedback; // Has the value of 57
PID2_t.pTerm = PID2_t.Kp * PID2_t.CurrentError; // Should count this to (57x2000) = 114000
当我调试时发生的事情是它没有。我可以在 pGain2 中定义的最大值(种类)是 1140。1140x57 给出 64980。
不知何故,程序认为PID2_t.pTerm 是uint16_t。但事实并非如此;它在结构中被声明为更大。
PID2_t.pTerm 以某种方式从结构中第一个声明的变量中获得了值uint16_t 或
计算有问题吗,我有一个uint16_t 乘以一个int16_t?如果我在结构之外声明它们,这将不会发生。
另外,这是我的 int def(以前从来没有问题:
#ifdef __18CXX
typedef signed char int8_t; // -128 -> 127 // Char & Signed Char
typedef unsigned char uint8_t; // 0 -> 255 // Unsigned Char
typedef signed short int int16_t; // -32768 -> 32767 // Int
typedef unsigned short int uint16_t; // 0 -> 65535 // Unsigned Int
typedef signed short long int int24_t; // -8388608 -> 8388607 // Short Long
typedef unsigned short long int uint24_t; // 0 -> 16777215 // Unsigned Short Long
typedef signed long int int32_t; // -2147483648 -> 2147483647 // Long
typedef unsigned long int uint32_t; // 0 -> 4294967295 // Unsigned Long
#else
# include <stdint.h>
#endif
【问题讨论】:
-
看起来你的 int24_t 被定义为 16 位。让我们看看typedef? :)
-
更重要的问题:
int有多大?你能在limits.h中查看INT_MAX/UINT_MAX吗? -
我从未在我的项目中包含limits.h!
-
尽管如此,
int在每个平台上都有一定的宽度/精度……可以推导出来INT_MAX。