加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

Keil MDK-ARM各种数据类型占用的字节数

(2013-12-16 14:34:29)
标签:

宇昂智慧

keil

arm

数据类型

学习笔记

it

【转】转:Keil MDK-ARM各种数据类型占用的字节数

 

转:Keil MDK-ARM各种数据类型占用的字节数

ARM学习笔记 2010-11-05 10:52:50 阅读48 评论0   字号:大小 订阅

 

笔者正在学习uCOS-II,移植到ARM时考虑到数据类型的定义,但对于Keil MDK编译器的数据类型定义还是很模糊,主要就是区分不了short int、int、long 和long int占用多少字节。为了得到一个权威的答案,改用编译器自身得出。

一、先定义几个变量,用于存放各数据类型的字节数。

//#include

#include

unsigned char a,b,c,d,e,f,g;

main()

{

   a=sizeof(char);

   b=sizeof(short int);

   c=sizeof(int);

   d=sizeof(long);

   e=sizeof(long int);

   f=sizeof(float);

   g=sizeof(double);

   while(1);

}

 

 

三、查看各地址存放的值。View---memory Window。

 

 

由上图可知得出:

       指针类型 *  统一为  4字节

 

char占用1个字节

short int占用2字节

int占用4字节

long占用4字节

long int占用4字节

float占用4字节

double占用8字节

我们即可这样定义宏:

typedef unsigned char    uint8;      // 无符号8位整型变量
typedef signed   char    int8;       // 有符号8位整型变量
typedef unsigned short   uint16;     // 无符号16位整型变量
typedef signed   short   int16;      // 有符号16位整型变量
typedef unsigned int     uint32;     // 无符号32位整型变量
typedef signed   int     int32;      // 有符号32位整型变量
typedef float            fp32;       // 单精度浮点数(32位长度)
typedef double           fp64;       // 双精度浮点数(64位长度)

    二、查看各变量的存放地址。View---Symbols Window。
   下面是real view官方文档的说明:

    

常数意义值十六进制值
CHAR_MAX
char的最大值255
0xFF

CHAR_MIN
char的最小值0
0x00

SCHAR_MAX
signed char的最大值127
0x7F

SCHAR_MIN
signed char的最小值–128
0x80

UCHAR_MAX
unsigned char的最大值255
0xFF

SHRT_MAX
short的最大值32 767
0x7FFF

SHRT_MIN
short的最小值–32 768
0x8000

USHRT_MAX
unsigned short的最大值65 535
0xFFFF

INT_MAX
int的最大值2 147 483 647
0x7FFFFFFF

INT_MIN
int的最小值–2 147 483 648
0x80000000

LONG_MAX
long的最大值2 147 483 647
0x7FFFFFFF

LONG_MIN
long的最小值–2 147 483 648
0x80000000

ULONG_MAX
unsigned long的最大值4 294 967 295
0xFFFFFFFF

LLONG_MAX
long long的最大值 9.2E+18
0x7FFFFFFF FFFFFFFF

LLONG_MIN
long long的最小值–9.2E+18
0x80000000 00000000

ULLONG_MAX
unsigned long long的最大值 1.8E+19
0xFFFFFFFF FFFFFFFF

 

鄙人附加:

 四:  结构体成员引用,往往通过内存偏移计算,引用另外成员变量。这时需注意的有:

   eg:

   sturct  link{  unsinged int *a;

                  unsigned int *b;

                  unsigned int  c;

                 unsigend  int d;          

            };  struct link  link1;

      unsigned int e=link1->c;     uint *  f=   &link->a; 

      uint  *g= *(f+1);// **g=link1->b

 成员变量偏移计算注意:1 得到一个成员函数的内存地址,步进决定于运算成员的数据类型,如(g=f+1,1表示一个单位int长度,uint 占2字节),这个最终得参考内存对齐原理,对齐了肯定遵从上规则

   所取的内存运算后的地址赋值给g,g的类型必须跟原基地址(原成员)的一致。 否则,运算出错

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有