程序的可移植性——字长/不透明数据/数据对齐/大小端

 字长

能被系统一次处理完的数据就是字,而字长根据不同系统而不同,32位系统字长就是32bit,4个字节。


不透明数据

为了方便移植,需要屏蔽底层数据字长对系统上层的设计的影响,因此用typedef对不同数据进行重命名。被typedef重命名的数据就是不透明数据。例如进程标识符pid_t,实际上是int型。定义在include/linux/types.h

/
* bsd */
typedef unsigned char           u_char;
typedef unsigned short          u_short;
typedef unsigned int            u_int;
typedef unsigned long           u_long;


/* sysv */
typedef unsigned char           unchar;
typedef unsigned short          ushort;
typedef unsigned int            uint;
typedef unsigned long           ulong;


#ifndef __BIT_TYPES_DEFINED__
#define __BIT_TYPES_DEFINED__


typedef         __u8            u_int8_t;
typedef         __s8            int8_t;
typedef         __u16           u_int16_t;
typedef         __s16           int16_t;
typedef         __u32           u_int32_t;
而__u8之类的数据定义在:~/linuxKernel/linux-2.6.34$ vim include/asm-generic/int-ll64.h
typedef unsigned char __u8;
typedef __signed__ char __s8;
typedef __signed__ short __s16;typedef unsigned short __u16;typedef __signed__ int __s32;typedef unsigned int __u32;#ifdef __GNUC____extension__ typedef __signed__ long long __s64;__extension__ typedef unsigned long long __u64;#elsetypedef __signed__ long long __s64;typedef unsigned long long __u64;

数据自然对齐

数据自然对齐,就是一个数据的存储地址刚好是它长度的整数倍。例如,4个字节的数据,存放地址刚好是4字节的整数倍。如5个字节大小的数据,其地址刚好是5字节的倍数。对于系统性能来说很重要,有些系统能自动系统对齐,但是牺牲了系统性能,所以,程序员最好能在设计的时候就手动对齐数据。移植系统需要考虑大小端,不同系统不一致,测试大小端程序如下。

调试时候遇到问题:

1.打印16进制,要用%x,%d是打印十进制,显示结果不一样。

2.if比较时,记得是0x12,十六进制比较,不要写成十进制:12。

#include <stdio.h>
typedef unsigned int  word;
typedef unsigned char byte;


int main()
{


        word val_32bit = 0x12345678;
        byte val_8bit =*((byte*)(&val_32bit));
        printf("val_8bit = %x\n",val_8bit);
        if(val_8bit==0x12){
                printf("big end\n");
        }
        else
        {
                printf("little end\n");
        }
        return 0;
}







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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值