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

时间:2021-07-08 21:59:39
 字长

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