可移植性

一、字长和数据类型

  • 字指的是机器一次处理数据的位数,如64位芯片的字长为64bit,即8字节。
  • c 语言定义的long整型总是等于机器的字长。
  • ANSI C标准规定,一个char的长度一定是1字节。
  • int (short)在目前linux所有支持的体系结构中都是32(16)位,虽然没有明确规定。
  • 注意long 和 指针 会在32位和64位中变化,所以不要假设 sizeof( int ) == sizeof(long) ==sizeof(p)。
  •  linux内核用typedef实现了长度明确的数据类型,如s8(带符号字节),u64(无符号64位整型)等。

二、处理不透明类型原则(如dev_t,gid_t等)

  1. 不要假设该类型的长度,因为在不同系统中其长度不一,且内核开发者可随意修改。
  2. 不要将该类型转化为其对应的C标准使用。
  3. 编码时保证其实际存储空间和格式变化时,代码不受影响

三、数据对齐

参考关于结构体内存对齐总结C结构体中数据的内存对齐问题

四、字节序问题

  • 最高有效字节放在低位上的为大端,反之为小端。x86用的就是小端。
  • 网络字节序都是大端传输。
  • 判断给定机器主机字节序的代码:
int x = 1;

if(*(*char)&x == 1)
    printf("little-endian");
else
    printf("big-endian");


//常用宏命
u32 __cpu_to_be32(u32) /* cpu字节序转为大端 */ 
u32 __cpu_to_le32(u32) /* cpu字节序转为小端 */ 
u32 __be32_to_cpu(u32) /* 大端转为cpu字节序 */ 
u32 __le32_to_cpu(u32) /* 小端转为cpu字节序 */ 

五、时间,页大小,处理器排序等

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值