正在加载...
 
< C++ 实践 ---...
不得不说的安全 --... >
C++ 内置类型(未完成) 
  主题:[编程] | 标签:C/C++ | 浏览数(366) | 评论数(1) | 09-17 09:51

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 类型常量

 

http://www.i170.com/Article/111097/trackback

评论:

  liangar  09-19 08:25 评论  

现在正是32/64并行的时候,编程特别要小心位数问题。

昨天就碰到,tcp/ip很多结构用的是32bit的结构,程序移植到64bit就出问题了。

 

一般,现在可以用:

int32_t

uint32_t

int64_t

等,其他的short是16bit,int,long是随机器位数而定,用时应与bit无关才用。

    发表评论: