最近写代码,老是忘记short,long int 类型大小,还有kernel.h常用数据和函数。有点小时间,记录下来。
基本数据类型
这个表格是网上复制下来的。
arch
char
short
int
long
ptr
long-long
u8
u16
u32
u64
i386
1
2
4
4
4
8
1
2
4
8
alpha
1
2
4
8
8
8
1
2
4
8
armv4l
1
2
4
4
4
8
1
2
4
8
ia64
1
2
4
8
8
8
1
2
4
8
m68k
1
2
4
4
4
8
1
2
4
8
mips
1
2
4
4
4
8
1
2
4
8
ppc
1
2
4
4
4
8
1
2
4
8
sparc
1
2
4
4
4
8
1
2
4
8
sparc64
1
2
4
4
4
8
1
2
4
8
总之
sizeof (char)=1,sizeof(short)=2,sizeof(int)=4,sizeof(long long)=8占用内存大小是固定的,
long和ptr占用内存大小跟cpu字长一致,如是32bit CPU,sizeof就是4;64bit CPU,sizeof就是8,
对于s8,s16,s32,s64和u8,u16,u32,u64这2组分别对应有符号和无符号的4个整数,长度分别为1,2,3,4,顾名思义,很好记。
size_t这是个CPU相关类型,32bit CPU sizeof是4, 64bit CPU sizeof是8
ssize_t是size_t的signed型。
基本常量
数据类型的极限值,如下signed型最大最小值给出;unsigned型最大值给出,最小值当然是0啦。
#define USHRT_MAX((u16)(~0U))//unsigned short int MAX
#define SHRT_MAX((s16)(USHRT_MAX>>1))//short int MAX
#define SHRT_MIN((s16)(-SHRT_MAX - 1))//short int MIN
#define INT_MAX((int)(~0U>>1))//int MAX
#define INT_MIN(-INT_MAX - 1)//int MIN
#define UINT_MAX(~0U)//unsigned int MAX
#define LONG_MAX((long)(~0UL>>1))//long int MAX
#define LONG_MIN(-LONG_MAX - 1)//long int MIN
#define ULONG_MAX(~0UL)//unsigned long int MAX
#define LLONG_MAX((long long)(~0ULL>>1))//long long int MAX
#define LLONG_MIN(-LLONG_MAX - 1)//long long int MIN
#define ULLONG_MAX(~0ULL)//unsigned long long int MAX
基本宏
/*求数组大小*/
#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]) + __must_be_array(arr))
/*分数乘以一个整数,避免溢出和损失进度的宏,其中x为分子,denom为分母,number为乘数*/
#define mult_frac(x, numer, denom)(\
{\
typeof(x) quot = (x) / (denom);\
typeof(x) rem = (x) % (denom);\
(quot * (numer)) + ((rem * (numer)) / (denom));\
}\
)
/*整数n取其bit32~bit63*/
#define upper_32_bits(n) ((u32)(((n) >> 16) >> 16))
/*整数n取其bit0~bit31*/
#define lower_32_bits(n) ((u32)(n))
/*这4个最大最小值宏顾名思义即可,有严格的类型检查,*/
/*
如
(void) (&_min1 == &_min2);如两个指针类型不同是不能进行相互比较的,编译器给出警告*/
min(x,y)
max(x,y)
min3(x,y,z)
max3(x,y,z)
//它的非严格检查版本
min_t(type, x, y)
max_t(type, x, y)
/*变量数据交换*/
#define swap(a, b) \
do { typeof(a) __tmp = (a); (a) = (b); (b) = __tmp; } while (0)
/*
*
从结构体的成员变量指针来获取整个结构体的指针
*type为结构体类型,member为type中的成员名,ptr为member的指针
*/
#define container_of(ptr, type, member) ({\
const typeof( ((type *)0)->member ) *__mptr = (ptr);\
(type *)( (char *)__mptr - offsetof(type,member) );})
数据对其相关
一般在内存分配时,或者有意对某一个数对其时,需要考虑数据对其上下界。
比如内存分配必须对齐4字节,那么地址17就必须分配为32,地址34就必须分配为64。
#define ALIGN(x, a)__ALIGN_KERNEL((x), (a))
#define __ALIGN_KERNEL(x, a)__ALIGN_KERNEL_MASK(x, (typeof(x))(a) - 1)
#define __ALIGN_KERNEL_MASK(x, mask)(((x) + (mask)) & ~(mask))
x为输入值,a为待对齐数(a需为2的幂)。
等价于ALIGN(x,a)=((x) + ((typeof(x))(a) - 1)) & ~(typeof(x))(a) - 1)
不考虑x的类型,即简化为(((x)+(a)-1)&~(a-1))
比如linux页对齐,ALIGN(4432,4096)=8192,ALIGN(789,4096)=4096。
对齐函数宏:
其中第一个参数为输入值,a为带对齐数(必须为2的幂)
/*返回x相对于a的对齐上界值*/
#define ALIGN(x, a)__ALIGN_KERNEL((x), (a))
/*返回p相对于a的对齐上界指针值*/
#define PTR_ALIGN(p, a)((typeof(p))ALIGN((unsigned long)(p), (a)))
/*判断x是否相对于a对齐*/
#define IS_ALIGNED(x, a)(((x) & ((typeof(x))(a) - 1)) == 0)
任意基数对齐宏:
这2个宏不像上面,对齐可以为任意正整数
/*x相对于y对齐的上界*/
#define roundup(x, y) (\
{\
const typeof(y) __y = y;\
(((x) + (__y - 1)) / __y) * __y;\
}\
)
/*x相对于y对齐的下界*/
#define rounddown(x, y) (\
{\
typeof(x) __x = (x);\
__x - (__x % (y));\
}\
)
说白了简单点就是
roundup(x,y)=((x+(y-1))/y)*y
rounddown(x,y)=x-(x%y)或者(x/y)*y