首页 > 编程知识 正文

c语言中far是什么意思,c语言 far

时间:2023-05-03 23:31:59 阅读:272508 作者:427

熟悉编程的通常会用到一些LP开头的数据类型来定义指针,比如以下VS里minwindef.h中的部分内容:

typedef unsigned long DWORD;typedef int BOOL;typedef unsigned char BYTE;typedef unsigned short WORD;typedef float FLOAT;typedef FLOAT *PFLOAT;typedef BOOL near *PBOOL;typedef BOOL far *LPBOOL;typedef BYTE near *PBYTE;typedef BYTE far *LPBYTE;typedef int near *PINT;typedef int far *LPINT;typedef WORD near *PWORD;typedef WORD far *LPWORD;typedef long far *LPLONG;typedef DWORD near *PDWORD;typedef DWORD far *LPDWORD;typedef void far *LPVOID;typedef CONST void far *LPCVOID;

其中有用到near和far,简单来看分别是定义短指针和长(L)指针。可以验证typedef时用near修饰指针长度是far修饰指针长度的一半。由于以前没看见过,就好奇查了查,总结了以下结果:

near和far是在定义近指针、远指针需要用到的,是16位CPU造就的怪胎;
现在的32位以上的CPU已经没有这种形式了。

16位CPU(主要指80386和80486)内部数组总线为16位,地址总线为24位。这就意味着一个字(16bit)存不下一个地址,要用到两个字。习惯把高位字称为段地址,低位字称为偏移地址。
程序运行时,OS会给程序分配几个内存段供程序使用,主要的有代码段(CS)、数据段(DS)、堆栈段(SS)。根据不同的编译模式这几个段可能重合。

当指针指向的地址与数据段的段地址相同(即处于数据段内),这时可以不记录段地址而仅记录偏移地址(只需16bit)。这种指针称为近指针(near指针)。

当指针指向的地址与数据段的段地址不同(即处于数据段外),这里不仅要记录偏移地址还要记录段地址(共需32bit)。这种指针称为远指针(far指针)。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。