浅谈基本数据类型的长度

【int】

 ① C/C++规定int字长和机器字长相同;(机器字长指主板上数据总线字长及CPU字长,当前一般为64bit)【只是定义】

 ② gcc/g++可使用-m 32或-m 64来指定编译32bit还是64bit应用程序;如果没有指定,则根据操作系统字长来定义int字长;【实际实现】

备注:与安装的gcc/g++是32bit还是64bit无关,无论安装32bit还是64bit的gcc/g++,均能编译32bit和64bit的应用程序;与运行的操作系统也无关。


在数据结构的设计中,优秀的程序员并不会这样定义数据结构(假设为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型的交集字符,在进行算术运算时,可根据需要再使用显示地声明或者强制转换。


【size_t】

1、gcc/g++对于size_t的定义

对于.c文件,size_t类型定义在gcc编译器提供的头文件stddef.h中;对于.cpp文件,size_t类型定义在g++编译器提供的头文件cstddef中;

根据定义,在32bit操作系统下编译size_t为unsigned int(4字节),64bit操作系统下size_t被定义为unsigned long(8字节);(注意与gcc/g++本身是32bit还是64bit无关)


2、size_t与size_type的区别

size_t是C/C++的一个标准的typedef,全局有效,定义在全局的命名空间中;

size_type是由string类类型和vector类类型定义的,参考:http://baike.baidu.com/view/3495546.htm


复习一下GCC命令行参数,看看各个版本的区别

32位版:加上 -m32 参数,生成32位的代码。

64位版:加上 -m64 参数,生成64位的代码。

debug版:加上 -g 参数,生成调试信息。

release版:加上 -static 参数,进行静态链接,使程序不再依赖动态库。加上 -O3 参数,进行最快速度优化。加上-DNDEBUG参数,定义NDEBUG宏,屏蔽断言。


当没有-m32或-m64参数时,一般情况下会生成跟操作系统位数一致的代码

32位Linux下的GCC,默认是编译为32位代码。

64位Linux下的GCC,默认是编译为64位代码。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值