C语言常量类型及名称,c语言基本数据类型和常用常量及函数

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值