
1. 整形
C++ 中的整形有 8 种,包括 char, short, int, long 以及它们的无符号版本。C++ 的整形的大小是平台依赖的,不同平台可能表现出不同的大小,但是也有一定的规定:
<1> short 至少是 16 bits
<2> int 至少和 short 一样长
<3> long 至少是 32 bits 并且至少和 int 一样长
目前来说(2008/09/17),在 32 bits 的操作系统平台上,short 为 16 bits,int 为 32 bits,long 为 32 bits
在头文件 climits(limits.h)中定义了符号常量表示了整数类型的信息,例如定义了 INT_MAX 表示了 int 类型能够保存的最大值,定义了 CHAR_MAX 表示 char 类型的最大值等。
C99 添加了 2 个新的类型,long long 和 unsigned long long,这两种类型至少是 64 bits,并且它们至少和 long 和 unsigned long 一样长。
2. 整形的溢出问题
<1> 无符号数的溢出
unsigned int nNum = 0xffffffff;
++nNum; // nNum 为 0
注意,nNum 表示了一个 32 bits 的内存区域,当溢出发生时,绝对不会影响到这 32 bits 区域之外的区域,下同。
<2> 有符号数的溢出
int nNum = 0x7fffffff; // INT_MAX
++nNum; // nNum 为最小的整数 0x80000000
对于有符号数的表示法,可以参考:http://www.i170.com/user/killercat/Article_110496
3. 字符常量
C++ 中,有三种不同的方式(十进制、八进制、十六进制)来书写整形常量,我们通过 Literals 的前两位来表示整形常量的基数(n 进制):
第一位为 1 - 9,表示是一个十进制数(基数为 10)
例如:std::cout << "Year: " << 2008 << std::endl;
这里的字符常量(Literals)2008 将被存储为什么样的类型?答案是,如果没有其他理由(例如,使用了后缀),那么将其储存为 int 类型。字符常量的后缀决定了字符常量被存储的类型:
2008l 或者 2008L ---- long 类型常量
2008ul 或者 2008UL ---- unsigned long 类型常量
liangar 09-19 08:25 评论 现在正是32/64并行的时候,编程特别要小心位数问题。
昨天就碰到,tcp/ip很多结构用的是32bit的结构,程序移植到64bit就出问题了。
一般,现在可以用:
int32_t
uint32_t
int64_t
等,其他的short是16bit,int,long是随机器位数而定,用时应与bit无关才用。
Powered by Haiwit