在TI提供的库中,几种基本的数据类型的定义如下:
#ifndef DSP28_DATA_TYPES #define DSP28_DATA_TYPES typedef intint16;// = 2? typedef longint32; // = 4? typedef long longint64; // = 8? typedef unsigned intUint16; // = 2? typedef unsigned longUint32; // = 4? typedef unsigned long long Uint64; // = 8? typedef floatfloat32; typedef long doublefloat64; #endif
但是,在实际的sizeof代码测试中,返回的值结果并不一样:
使用的代码是:
int sizeChar,sizeShort,sizeInt,sizeLong,sizeLongLong,sizeLongDouble,sizeFloat; int main(void) { sizeChar = sizeof(char); sizeShort = sizeof(short); sizeInt = sizeof(int); sizeLong = sizeof(long); sizeLongLong = sizeof(long long); sizeFloat = sizeof(float); sizeLongDouble = sizeof(long double); return 0; }
后续,继续测试,使用一个共同体,测试如下:
union u_temp{ Uint32 _int32; unsigned char _int8[4]; }temp; int main(void) { temp._int32 = 0x12345678; return 0; }
也就是说,假如char是正常的8位宽度的话,实际标注的Uint32的宽度实际上也仅仅是16位。只有使用到longlong才能提供32位宽度的数据类型。
Jason Wu4:
由于2812数据总线位16位,虽然char的数据长度为8位,但在2812中还是存放在16位的空间中,所以2812中定义的char实际为16位的大小,Uint32为32位,longlong为64位
在TI提供的库中,几种基本的数据类型的定义如下:
#ifndef DSP28_DATA_TYPES #define DSP28_DATA_TYPES typedef intint16;// = 2? typedef longint32; // = 4? typedef long longint64; // = 8? typedef unsigned intUint16; // = 2? typedef unsigned longUint32; // = 4? typedef unsigned long long Uint64; // = 8? typedef floatfloat32; typedef long doublefloat64; #endif
但是,在实际的sizeof代码测试中,返回的值结果并不一样:
使用的代码是:
int sizeChar,sizeShort,sizeInt,sizeLong,sizeLongLong,sizeLongDouble,sizeFloat; int main(void) { sizeChar = sizeof(char); sizeShort = sizeof(short); sizeInt = sizeof(int); sizeLong = sizeof(long); sizeLongLong = sizeof(long long); sizeFloat = sizeof(float); sizeLongDouble = sizeof(long double); return 0; }
后续,继续测试,使用一个共同体,测试如下:
union u_temp{ Uint32 _int32; unsigned char _int8[4]; }temp; int main(void) { temp._int32 = 0x12345678; return 0; }
也就是说,假如char是正常的8位宽度的话,实际标注的Uint32的宽度实际上也仅仅是16位。只有使用到longlong才能提供32位宽度的数据类型。
HY Dee:
回复 Jason Wu4:
也就是说,因为数据总线是16位的关系,所以即使向一个char类型中存储0x01,实际存储进去的也是0x0001。因为这个原因,所以,我的共同体的实际样式为:
{
int32 a;
char b[2];
}
然后一个char类型的数据,实际上能够存下0xFFFF。
在TI提供的库中,几种基本的数据类型的定义如下:
#ifndef DSP28_DATA_TYPES #define DSP28_DATA_TYPES typedef intint16;// = 2? typedef longint32; // = 4? typedef long longint64; // = 8? typedef unsigned intUint16; // = 2? typedef unsigned longUint32; // = 4? typedef unsigned long long Uint64; // = 8? typedef floatfloat32; typedef long doublefloat64; #endif
但是,在实际的sizeof代码测试中,返回的值结果并不一样:
使用的代码是:
int sizeChar,sizeShort,sizeInt,sizeLong,sizeLongLong,sizeLongDouble,sizeFloat; int main(void) { sizeChar = sizeof(char); sizeShort = sizeof(short); sizeInt = sizeof(int); sizeLong = sizeof(long); sizeLongLong = sizeof(long long); sizeFloat = sizeof(float); sizeLongDouble = sizeof(long double); return 0; }
后续,继续测试,使用一个共同体,测试如下:
union u_temp{ Uint32 _int32; unsigned char _int8[4]; }temp; int main(void) { temp._int32 = 0x12345678; return 0; }
也就是说,假如char是正常的8位宽度的话,实际标注的Uint32的宽度实际上也仅仅是16位。只有使用到longlong才能提供32位宽度的数据类型。
Jason Wu4:
回复 HY Dee:
没错,不过高八位可能为0,也可能为随机数
在TI提供的库中,几种基本的数据类型的定义如下:
#ifndef DSP28_DATA_TYPES #define DSP28_DATA_TYPES typedef intint16;// = 2? typedef longint32; // = 4? typedef long longint64; // = 8? typedef unsigned intUint16; // = 2? typedef unsigned longUint32; // = 4? typedef unsigned long long Uint64; // = 8? typedef floatfloat32; typedef long doublefloat64; #endif
但是,在实际的sizeof代码测试中,返回的值结果并不一样:
使用的代码是:
int sizeChar,sizeShort,sizeInt,sizeLong,sizeLongLong,sizeLongDouble,sizeFloat; int main(void) { sizeChar = sizeof(char); sizeShort = sizeof(short); sizeInt = sizeof(int); sizeLong = sizeof(long); sizeLongLong = sizeof(long long); sizeFloat = sizeof(float); sizeLongDouble = sizeof(long double); return 0; }
后续,继续测试,使用一个共同体,测试如下:
union u_temp{ Uint32 _int32; unsigned char _int8[4]; }temp; int main(void) { temp._int32 = 0x12345678; return 0; }
也就是说,假如char是正常的8位宽度的话,实际标注的Uint32的宽度实际上也仅仅是16位。只有使用到longlong才能提供32位宽度的数据类型。
HY Dee:
回复 Jason Wu4:
刚刚尝试使用0xFFFF灌入一个char类型,得到的观测值还是0xFFFF。应该是没有清零。
那么,问题来了,我在实际编程中,需要如何注意此问题呢。
比如,sizeof得到的值就变得轻易不可用,对于header中没有定义的char的宽度和short的宽度,也就不敢轻易使用了。