Vb教程 Vb.net教程 Vfp教程 C/C++教程 Vc/Vc++教程 Delphi教程 Java教程 Powerbuilder
  杀毒频道 | 短信频道 | 网络电视 | 论文中心 | 学上网 | 学软件 | 网页特效 | 电脑基础 | 论坛  
  NCRE | 软考 | CET | 职称英语 | 司法考试 | 报关员 | 公务员 | CATTI | CPA考试  
  Html教程 | Css教程 | Xml教程 | Asp教程 | Asp.net | Php教程 | Jsp教程 | Linux教程 | QQ技巧  
Photoshop Illustrator ImageReady Maya教程 3D Max教程 Lightscape Coredraw教程 Authorware Autocad教程 Freehand教程
Access教程 Mysql教程 Sql server Oracle教程 Word教程 Excel教程 Powerpoint Frontpage Asp.net源码 Php源代码
Flash教程 Fireworks Dreamweaver C#教程 outlook教程 系统安装 vbscript教程 Javascript Jsp源代码 Asp源代码
您的位置:首页 >> C/C++教程 >> 正文

使用typedef来定义新的整数类型
文章来源:互联网

C或者C++内置的整数数据类型的长度是很含糊的。这种含糊性会导致难以预料的意外和后果,尤其是在不同CPU和不同编译器之间移植嵌入式代码的时候。

下面是内置的整数类型的基本规则:

char是8位的或者更长。基本的无限制的char可以缺省为有符号的或者是无符号的;具体选择哪种就要看编译器了。
short至少是16位的,而且要不大于int的长度。
int至少是16位的,而且要不小于short的长度。它通常是机器整数的自然长度,典型的是16位或者32位。尽管ANSI的C语言要求int是16位的或者更长,但是有些用于小型处理器的非常规嵌入式编译器允许使用8位的int。
long不少于int的长度。它通常是32位或者64位的。
 
下面是两个简单的例子,用来说明这些不确定性所导致的问题。

例一:访问内存映射I/O端口
在下面的例子里,你准备把什么写到内存映射I/O端口去?

    char data = 0x80;
    unsigned int *port = PORT_ADDR;
    *port = data;

其结果要依赖于你的编译器和CPU的架构。下面是一些可能性:

将0x0080写到一个16位的内存映射端口。
将0xFF80写到一个16位的内存映射端口。
将0xFFFFFF80写到一个32位的内存映射端口。
将0x00000080写到一个32位的内存映射端口。
上面这些情况可能会将错误的数据位写入到目标I/O端口,还可能写到相邻的端口。
例二:循环计数器的不定长度
 
void func(int ncount)
{      
    while (ncount--) {
        /* body of loop */
    }
}

从表面上来看,上面的代码看起来没有问题,但是当你将它从一个32位的处理器(32位的int)移植到一个16位的处理器(16位int)时,会发生什么?ncount这个参数会在一个16位的CPU上要求一个16位的解决方案还是32位的解决方案?这还不清楚,但是如果需要使用32位的解决方案,代码就要更改。

定义你自己的数据类型
解决这些不确定性的最简单解决方案是:完全避免使用内置的C语言数据类型;而是使用C语言的typedef机制来自定义数据类型,让其明确地定义整数的长度。

下面是你应该如何定义系统里首标文件新的数据类型。(下面的例子使用一个典型16位编译器。)

typedef unsigned char   BYTEu;     /*  8 bit  unsigned integer */
typedef unsigned int    INT16u;    /* 16 bit  unsigned integer */
typedef unsigned long   INT32u;    /* 32 bit  unsigned integer */
typedef signed char     BYTEs;     /*  8 bit  signed integer    */
typedef signed int      INT16s;    /* 16 bit  signed integer   */
typedef signed long     INT32s;    /* 32 bit  signed integer   */

你可以使用新的数据类型来取代内置的类型,从而对你的数据和变量进行声明。

下面的代码第一个例子看起来的样子。它更加明确,而且能够被轻易地移植到不同的编译器和CPU架构上。它会一直将0x0080写到一个16位的内存映射I/O端口上。

    BYTEu x = 0x80;
    INT16u *port = PORT_ADDR;
    *port = x;

你使用typedef数据类型能够获得的主要好处有:

代码更清晰,更具有可读性
易于移植。当你将自己的代码用于新的处理器时,你就只需要更改包含有数据类型定义的首标文件,就能够反映出到新的编译器和CPU架构的转换。
代码和数据长度的优化。当你看到自己的数据类型时,你可以明确地声明每个数据项和变量的长度。但是不要将任何选择交给编译器。这样的话,你可以确信自己一直都在使用适合这份工作的最佳长度的整数。更长的整数需要更多的内存来存储数据,而且一般都需要更多的CPU和内存周期来处理。例如,一个16位的编译器能够将一个16位的算术运算映射到单个操作代码,但是32位的操作可能会调用一个长的库函数。

[返回]

编程语言 web开发 数据库 网络技术 操作系统 服务器 网页设计 图形设计 办公软件 常用软件 学电脑

Copyright© www.bianceng.cn Powered by 编程入门网 All Rights Reserved.
关于本站 | 版权声明 | 联系我们 | 友情链接 |
编程入门网 版权所有