Chinaunix首页 | 论坛 | 博客
  • 博客访问: 987969
  • 博文数量: 158
  • 博客积分: 4380
  • 博客等级: 上校
  • 技术积分: 2367
  • 用 户 组: 普通用户
  • 注册时间: 2006-09-21 10:45
文章分类

全部博文(158)

文章存档

2012年(158)

我的朋友

分类: C/C++

2012-11-16 10:32:23

很多人对C/C++中的整型不太了解,导致代码移植的时候出现问题,本人在此总结一下,若有描述错误,请务必指出,谢谢!

a. C/C++对整型长度的规定是为了执行效率,将int定义为机器字长可以取得最大的执行速度;
b. C/C++中整型包括:int, char 和 enum, C++中还包含bool类型,C99中bool是一个宏,实际为_Bool;
c. C 和 C++ 对 enum 的规定有所不同,这里不描述;
d. 修饰整型正负的有 signed 和 unsigned,对于 int 默认为 signed;
e. 修饰 int 大小的有 short 和 long, 部分编译器还扩展了一些更长的整型,比如 long long 和 __int64, C99中增加了long long和unsigned long long;
f. int 的长度 与 机器字长相同, 16位的编译器上int长16位,32位的编译器上int长32位;
g. short int 的长度 小于等于 int 的长度,注意她们可能长度相等,这取决于编译器;
h. long int 的长度 大于等于 int 的长度,注意她们可能长度相等,这取决于编译器;
i. char 的长度应当可以包容得下一个字符,大部分系统中就是一个字节,而有的系统中可能是4个字节,因为这些系统中一个字符需要四个字节来描述;
(此条款作废,C99和CPP2003中都规定sizeof(char)==1)
j. char 的正负取决于编译器,而编译器的决定取决于操作系统,在不同的编译器中char可能等同于signed char,也可能等同于unsigned char; 参见http://blog.vckbase.com/bruceteen/articles/25581.html#33340

总结:
a. 出于效率考虑,应该尽量使用int和unsigned int;
b. 当需要指定容量的整型时,不应该直接使用short、int、long等,因为在不同的编译器上她们的容量不相同。此时应该定义她们相应的宏或类型,比如在VC++6.0中,可以如下定义:
typedef unsigned char UBYTE;
typedef   signed char SBYTE;
typedef unsigned short int UWORD;
typedef   signed short int SWORD;
typedef unsigned int UDWORD;
typedef   signed int SDWORD;
typedef unsigned __int64 UQWORD;
typedef   signed __int64 SQWORD;
然后在代码中使用 UBYTE、SBYTE、UWORD 等,这样当代码移植的时候只需要修改相应的类型即可。
定义自己的类型虽然在代码移植的时候只需要修改一处即可,但仍然属于源代码级别的修改,所以 C99/C++2.0 中将这些类型预先定义在文件(stdint.h)中,可以做到代码移植时无需修改代码。
c. 在定义char时,一定要加上 signed 或 unsigned,因为她的正负在不同的编译器上并不相同。
d. 不要想当然的以为char是1字节长(或9bits,2bytes,4bytes),因为她的长度在不同的编译器上并不相同。(此条款作废)

[补充说明]:g和h的描述有问题,当进入64位系统时,有两个扩展标准,其一就如同g和h所述,把short和long作为int的修饰词;而第二个标准为了兼容大量的旧有代码,将long作为和int平等的关键字,此时sizeof(int)==8,而sizeof(long)==4。第二个标准应用最广,包括Intel、AMD、MS都执行第二个标准。 参见http://blog.vckbase.com/bruceteen/archive/2006/11/06/22996.html

[补充说明]:char特性要么完全和signed char一致,要么完全和unsigned char一致,但char,signed char,unsigned char是三种独立的类型;
1byte有CHAR_BIT个bits,CHAR_BIT>=8。
阅读(4420) | 评论(24) | 转发(2) |
给主人留下些什么吧!~~

faf882012-11-16 20:12:55

謝謝分享~
与其羡慕别人富有!到不如自己来创造自己的财富!
只要您愿意做,只要您愿意开始做,不用入会费,不用加盟金,
免费注册网址>> http://migre.me/bFG4O
觉得适合你再投入(合法经营,需满18岁)

网友评论2012-11-16 10:38:41

temp
问个事,你知不知道,在.net的Enum中用中文,会不会发生失效的情况?感觉很是不稳当,但又很想用啊

网友评论2012-11-16 10:38:24

Dave
对于int和long的宽度处理策略确实如lz所言,有过两种不同的策略争论,但在实际的64bit compiler上肯定有一种普遍被采用的方案,现在gcc 64bit 采用的是保留int为4byte,而long扩充为8byte的办法。其实只要稍微写个程序测试一下就知道乐

网友评论2012-11-16 10:38:11

周星星
我都不好意思回答你的问题,你还好意思隔一小时重复发一次帖?
过一会儿我要删掉一个,如果你同意,我可以把你这两个同样的问题连同我这次的回答都删除掉。
我建议你同意,因为你的问题一点也不幽默。
当然我不会强迫你。

1。VC区分C/C++靠的是扩展名,你把inline写在.c文件中看看能不能编译通过?
2。即使它能通过又怎么?inline是为C++而引入的,并不是为C99而引入的。不能因为汉字中某些字和日文中某些字相同,就认为中文支持日文,或日文支持中文。
3。VC2005不支持C99,可谓路人皆知,而且到目前为止,M$也没有让VC2005支持C99的丝毫打算。

网友评论2012-11-16 10:37:57

10000
vs2005不支持c99??  
怎么得出的这个结论呢?
据我所知vs2005是支持C99的呀?  
比如:c99中规定了inline关键字,其他c标准中都没有,
在VS2005中就实现了inline呀。