c语言基本数据类型和常用常量及函数

16 篇文章 2 订阅
2 篇文章 0 订阅

最近写代码,老是忘记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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值