首页 > 代码库 > keil_4/MDK各种数据类型占用的字节数
keil_4/MDK各种数据类型占用的字节数
笔者正在学习uCOS-II,移植到ARM时考虑到数据类型的定义,但对于Keil MDK编译器的数据类型定义还是很模糊,主要就是区分不了short int、int、long 和long int占用多少字节。为了得到一个权威的答案,改用编译器自身得出。
一、先定义几个变量,用于存放各数据类型的字节数。
//#include<LPC214x.H>
#include<stdio.h>
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字节),这个最终得参考内存对齐原理,对齐了肯定遵从上规则
2 所取的内存运算后的地址赋值给g,g的类型必须跟原基地址(原成员)的一致。 否则,运算出错
keil_4/MDK各种数据类型占用的字节数