依睛(IT blog) 我回来了,PHP<-->C/C++ LINUX

笨鸟

统计

积分与排名

友情连接

最新评论

学用法 int型长度

int型长度
第三章 数据


Ø       基本数据类型

C 语言中只有 4 中基本数据类型——整型、浮点型、指针和聚合类型(如数组和结构等);所有其他类型都是从这 4 种基本类型的某种变化或组合派生而来。

一、整型家族

整型家族包括 char short int int long int ,并且都分为 signed unsigned 型。

int 型字长问题:

long int 型至少应该和 int 型一样长,而 int 型至少应该和 short int 一样长。

     C/C++ 规定 int 字长和机器字长相同;

操作系统字长和机器字长未必一致;

编译器根据操作系统字长来定义 int 字长;

http://www.programfan.com/club/showbbs.asp?id=145906

由上面三点可知,在一些没有操作系统的嵌入式计算机系统上, int 的长度与处理器字长一致;有操作系统时,操作系统的字长与处理器的字长不一定一致,此时编译器根据操作系统的字长来定义 int 字长:“比如你在 64 位机器上运行 DOS16 系统,那么所有 for dos16 C/C++ 编译器中 int 都是 16 位的;在 64 位机器上运行 win32 系统,那么所有 for win32 C/C++ 编译器中 int 都是 32 位的”。( CPU 字长 是指其一条指令 / 一次运算可以处理的数据的最大宽度。 http://www.cublog.cn/u/23458/showart.php?id=175995

另外,对于整型的数值范围,每个编译器里面都有一个标准头文件: limits.h ,这个头文件定义了一些宏,这些宏表示该编译器使用的所有数据类型的范围,编程过程中 使用这些宏就行了。例如你想要的 int 的最大值可以使用宏 INT_MAX ,最小值使用 INT_MIN ,而无符号则可以使用 UINT_MAX ,还有其它类型 的。你自己把这个头文件打开看看就知道了。

 

附:关于 整形变量为 32 的问题的剖析:

http://bbs.cpcw.com/viewthread.php?tid=666146

整形变量是不是 32 位这个问题不仅与具体的 CPU 架构有关,而且 与编译器有关。在嵌入式系统的编程中,一般整数的位数等于 CPU 字长,常用的嵌入式 CPU 芯片的字长为 8 16 32 ,因而整形变量的长度可能是 8 16 32 。在未来 64 位平台下,整形变量的长度可达到 64 位。

长整形变量的长度一般为 CPU 字长的 2 倍。

在数据结构的设计中,优秀的程序员并不会这样定义数据结构(假设为 WIN32 平台):

typedef struct tagTypeExample

{

unsigned short x;

unsigned int y; 

}TypeExample;

他们这样定义:

#define unsigned short UINT16 //16 位无符号整数

#define unsigned int UINT32 //32 位无符号整数

typedef struct tagTypeExample

{

UINT16 x;

UINT32 y; 

}TypeExample;

这样定义的数据结构非常具有通用性,如果上述 32 平台上的数据发送到 16 位平台上接收,在 16 位平台上仅仅需要修改 UINT16 UINT32 的定义:

#define unsigned int UINT16 //16 位无符号整数

#define unsigned long UINT32 //32 位无符号整数

几乎所有的优秀软件设计文档都是这样定义数据结构的。

 

char 型与程序可移植性:

char 类型变量在本质上是小整型值。

字符型( char 型)也分 signed char unsigned char 型,如果在定义变量时只使用关键字 char ,缺省情况下它根据编译器的定义为 signed char unsigned char ,这意味着不同机器上的 char 可能有不同的取值范围。因此,只有当程序使用的 char 型变量的值位于 signed char unsigned char 的交集中(例如编译器认为 char 8 位二进制长时,这个交集是 0~127 ASC Ⅱ字符集的字符都在这个范围内),这个程序才是可移植的。

进一步,如果显示地将字符变量声明为 signed unsigned ,则可提高程序的可移植性,不过,有些机器处理 signed char unsigned char 的能力是不同的,硬性规定后可能会使效率受损,还有不少处理字符的库函数的参数声明为 char ,因此显示声明也可能会有兼容性问题。

结论 :保证可移植性的最佳办法还是定义为 char 型同时只使用 signed char unsigned char 型的交集字符,在进行算术运算时,可根据需要再使用显示地声明或者强制转换。

posted on 2008-12-11 11:08 向左向右走 阅读(537) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。