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

来源:互联网 发布:淘宝店招设计素材 编辑:程序博客网 时间:2024/05/16 07:41
 字长

能被系统一次处理完的数据就是字,而字长根据不同系统而不同,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